-- 设置慢查询阈值(单位:秒,生产环境建议0.5-1秒,平衡灵敏度与日志量) SET GLOBAL long_query_time = 0.5; -- 开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; -- 指定日志文件路径(需确保MySQL有写入权限) SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; -- 记录未使用索引的查询(辅助定位索引失效场景) SET GLOBAL log_queries_not_using_indexes = 'ON';
索引选择性=唯一值数量/总行数,选择性越高,索引定位精度越强,IO次数越少。设计时需将高选择性字段(如用户ID、订单号)放在联合索引前列,低选择性字段(如性别、状态,选择性10可走索引,b>10则不可);
- 高频查询字段在前,低频字段在后,确保更多查询能命中索引前缀。
</ul> 示例:查询SELECT * FROM sales WHERE region='Asia' AND category='Tech' AND sale_date BETWEEN '2023-01-01' AND '2023-12-31' ORDER BY revenue DESC;,最优联合索引为idx_region_category_date (region, category, sale_date)。
## 3.2 索引失效的十大典型场景与解决方案
索引失效是慢查询的主要诱因,本质是破坏了B+树的有序性或定位规则,以下是实战中最常见的场景及优化方案:
失效场景 错误示例 优化方案 索引列参与计算/函数 SELECT * FROM users WHERE YEAR(create_time) = 2023; SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'; 隐式类型转换 SELECT * FROM logs WHERE user_id = '123'(user_id为INT); SELECT * FROM logs WHERE user_id = 123(匹配字段类型); LIKE以%开头 SELECT * FROM user WHERE userId LIKE '%123'; 改用覆盖索引或LIKE '123%';
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!