日期:2014-05-16  浏览次数:20763 次

MySQL 查询优化技巧

1,查询条件里有不等号
SELECT * FROM `t_user` WHERE `id` != 2 中,id 的索引将不会被使用。

2,查询条件里使用了函数
SELECT * FROM `t_user` WHERE DAY(`regTime`) = 6 中,regTime 的索引将不会被使用。
3,在JOIN操作中,主键和外键的数据类型不同
SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 中,如果 t_user 表的 id 字段和 t_user_city 表的 userId 字段数据类型不同,那么这两个字段的索引将不会被使用。
4,查询条件里使用比较操作符 LIKE 和 REGEXP,只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。
①SELECT * FROM `t_user` WHERE `name` LIKE ‘123%’ 和 ②SELECT * FROM `t_user` WHERE `name` LIKE ‘%123’ 中,① 查询能使用 name 的索引,而 ② 查询却不行。
使用索引查询出的记录数量超过全表记录的30%,MySQL 会遍历全表。
SELECT * FROM `t_user` WHERE `isNovice` = 1 中,t_user 表所有的记录都会被遍历,因为 isNovice 只有 0 和 1 这两个值,记录数各占 50%,设置 isNovice 为索引没有任何意义。

?

除了注意以上的几条规则以外,还有一些构造的技巧,也可以帮助你提升查询的效率。

1,尝试使用 IN 代替 OR
①SELECT * FROM `t_user` WHERE `id` = 2 OR `id` = 4 OR `id` = 6 OR `id` = 8 OR `id` = 10 和 ②SELECT * FROM `t_user` WHERE `id` IN (2, 4, 6, 8, 10) 中,② 的效率明显比 ① 要高的多。
2,避免在查询条件中使用函数
①SELECT * FROM `t_user` WHERE DATE(`regTime`) = ‘2010-02-01’ 和 ②SELECT * FROM `t_user` WHERE `regTime` > ‘2010-02-01’ AND `regTime` < ‘2010-02-02’ 中,② 的效率明显比 ① 要高的多。
使用简单的程序处理来代替数据库处理
3SELECT `userId`, SQRT(POW(`unitX`, 2) + POW(`unitY`, 2)) AS `distance` FROM `t_map_unit` WHERE `userId` = 2 中,计算距离的操作完全可以由程序来做,或者在需要的时候再用程序计算。为了图一时方便,让数据库来运算,是得不偿失的。
3,尽量避免使用联合查询
①SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 和 ②SELECT * FROM `t_user_city` 、③SELECT `name` FROM `t_user` WHERE `id` IN (……) ,我更建议使用后者,实际上通过增加简单的程序处理就可以实现,但是效率上区别确是很大的,特别是当 2 个表的记录都很多的时候。两个查询有时候比一个更快,这完全取决于查询语句的复杂度。