mysql中的性能优化问题
2018-03-28 10:39
260 查看
count(*)
当需要统计结果的行数时,尽量用count(*),而不是使用count(某一列)。当存在where条件时,需要先扫描条件中指定的数据,如果子条件中的数据过多,在统计行数时,可以使用相反的where条件,再用总数减去相反条件下的行数即可。优化limit分页
如果要使用limit 1000, 20, 需要查询1020条记录,最后只返回后20条记录,前面查询到的1000条记录要被抛弃。例如,要查询电影表中索引为1000到1009的数据,一般会这样写:
select id, title, description from film limit 1000, 10
但是,查询多列数据效率太低,可以先只查询id,再和自己关联就可以得到其他列的数据。优化后的语句如下:
select film.id, film.title, film.description from film inner join ( select id from film limit 1000, 10 ) as lim using(id)#两个表中有相同的字段名,可以用using,当然也可以用on。
如果某列位置上有索引,可以直接根据该索引进行分页。
如:
select film.id, film.title, film.description from film where position between 1000 and 1009 order by position
union()合并数据
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
除非真的需要消除重复行,否则一定要使用union all。如果没有all关键字,mysql会给临时表添加distinct操作,对临时表做唯一性检查。事实上,mysql问题把查询结果先放在临时表中,再返回给客户端。
用户自定义变量
用户自定义变量可以表示具体的值,也可以是的单个的select结果(select min()…),但不能是数据集合。定义方式如下:set @num := 0#可以使用=赋值,为避免歧义,用:=赋值。 select id, @num=@num+1 from film #假设id是从1开始的,结果如下: 1 1 2 2 3 3 ...
注意有一些限定条件,如:自定义变量无法查询缓存,只在一个链接中有效等。
另外,在where或者order by 中慎用用户自定义变量, 因为where和select是出现在查询的不同阶段。
如:
set @num :=0 select id, @num:=@num+1 from film where @num<=1
上面的语句,返回的结果是两行,而不是一行。可以这样修改:
set @num :=0 select id, @num from film where (@num := @num+1)<=1
用户自定义变量的用法较多,可以和greatest()和least()函数结合。
greatest(字段1, 字段2…)可以返回每一行数据中,多个字段中的最大值,select greatest()的结果为一列。
least()的用法是类似的,返回的是每一行中的最小值。
相关文章推荐
- MySQL使用rand获取随机记录的性能优化问题
- MySQL优化之—— 定位性能问题
- 从某次测试过程中,得到的MySQL性能优化的建议,和定位问题的方法 推荐
- mysql性能优化问题定位-待解决
- redmine在linux上的mysql性能优化方法与问题排查方案
- Oracle、MySQL的分页语句和使用ThreadLocal的性能优化问题
- MySql性能问题的定位,排查和优化总结
- mysql性能优化(五) mysql中SELECT+UPDATE处理并发更新问题解决方案
- MySQL性能优化小记:MySQL子查询很慢的问题
- mysql通过将or改成union来优化sql性能问题一例
- (1)mysql优化之sql性能问题定位
- 数据库性能优化(MySQL)
- 基于tomcat,mysql项目性能优化的几个切入点
- MySQL性能优化的最佳20+条经验
- 如何实现MySQL性能优化
- MySql5.6的性能优化
- MySQL性能优化之table_cache配置参数浅析
- (一) MySQL 性能优化 基础之索引概念
- MySQL性能优化之table_cache配置参数浅析
- MySQL 数据库性能优化——表结构优化