1. 确保查询使用索引;2. 避免在WHERE子句中使用函数;3. 选择合适的JOIN类型;4. 限制返回的行数,使用LIMIT。
细节一:索引优化
在MySQL中,索引是提升查询性能的最有效方法之一。确保经常查询的字段建立了合适的索引,特别是WHERE、JOIN和ORDER BY中的字段。对于复合索引,按查询频率从左到右设计。
细节二:避免函数和隐式转换
不要在WHERE条件中使用函数,比如WHERE DATE(create_time) = '2023-01-01',这会导致全表扫描。改为WHERE create_time >= '2023-01-01' AND create_time < '2023-01-02'。同样,避免字符串字段隐式类型转换。
细节三:优化JOIN查询
使用INNER JOIN代替LEFT JOIN当可能,避免笛卡尔积。确保JOIN字段上有索引,小表驱动大表,对于MySQL 8.0+可以使用索引嵌套循环(INL)或块嵌套循环(BNL)。
细节四:使用LIMIT和子查询优化
在分页查询中使用覆盖索引配合LIMIT,避免OFFSET过大。复杂子查询可以改为JOIN,减少嵌套层级。EXPLAIN分析执行计划,选择低cost的方案。
另一视角:排序优化
ORDER BY时,如果使用索引字段,避免filesort,使用延迟关联或覆盖索引。让排序字段在前面。
额外技巧:参数嗅探问题
动态SQL参数导致执行计划不稳定,使用查询重写或强制索引解决。
FAQ
Q: 如何查看查询是否用了索引?
A: 用EXPLAIN SELECT ... 查看key和rows列。
Q: 分页查询慢怎么优化?
A: 用子查询记录ID,然后JOIN获取数据,如SELECT * FROM table WHERE id > last_id LIMIT 10。
Q: 什么情况下不用建索引?
A: 低选择性字段、数据量小表、频繁更新的字段慎建。
Q: MyISAM和InnoDB索引区别?
A: InnoDB是聚簇索引,主键叶节点存整行;MyISAM是非聚簇,全行数据另存。