1、使用合理的分页方式提高分页的效率
使用常用的limit 进行分页的时候,我们会发现,随着数据量的增加,直接使用limit分页会越来越慢。
这时候我们可以使用上一页的最大的id然后用这个最大的id限制下一页的起点,比如在上一页的最大id是133211,sql可以写作
SELECT id FROM table WHERE id > 133211 limit 20
2、避免在WHERE语句中对字段进行null值的判断
对null的判断会导致引擎放弃使用索引从而进行全表扫描
3、不建议使用%进行前缀模糊查询
例如 LIKE “%name” 或者 LIKE “%name%”,这样的查询会导致索引失效而进行全表扫描,但是可以使用LIKE “name%”。
如果业务中必须用到%name%的时候,我们可以使用全文索引
创建全文索引的语法是:
ALTER TABLE 'table_name' ADD FULLTEXT INDEX `idx_user_name` (`user_name`);
使用全文索引的语法是:
SELECT id FROM table_name WHERE match(user_name) against('zhansan' in booleanmode);
注意:在需要创建全文索引之前,需要与DBA确认能否创建,使用时注意语法
4、避免在WHERE字与句中对字段进行表达式操作
比如:
SELECT id FROM table_name WHERE AGE * 2 > 35;
这样会造成引擎放弃使用索引,可以改为
SELECT id FROM table_name WHERE AGE > 35 / 2;
5、避免隐式类型转换
6、使用联合索引时,要遵守最左前缀法则
比如联合索引包含字段id,name,age,可以直接使用id字段,也可以使用id,name这样的顺序,蛋name,age都无法使用这个索引,所以在创建和使用联合索引的使用一定要注意字段的顺序,最常用的放在最前面。
7、必要的时候可以使用force index来强制查询走某个索引
8、对于联合索引来说,如果存在范围查询,比如 between,>,<等条件时,回造成后面的索引字段失效。
9、关于JOIN的优化
- A LEFT JOIN B;A表为驱动表
- A INNER JOIN B;MYSQL会自动找出数据少的表作为驱动表
- A RIGHT JOIN B; B表为驱动表
尽量使用INNER JOIN,避免LEFT JOIN
合理利用索引,被驱动表的索引字段作为ON的限制字段。
利用小表驱动大表;