您的位置:首页 > 数据库 > MySQL

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()的用法是类似的,返回的是每一行中的最小值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: