mysql 为什么左前缀

mysql联合索引怎么加 mysql创建多列索引的注意事项

联合索引这个东西需要仔细理解。
在MySQL中,可以使用ALTER TABLE或CREATE INDEX来完成操作。
但你要记住一个原则,叫做最左前缀原则。
这个东西相当重要。

1 . 如何创建联合索引
1 . 使用ALTER TABLE创建联合索引 例如,如果有一个orders表,则语句如下: sql ALTER TABLE Orders ADD INDEX idx_customer_order_status(customer_id, order_date, status);
这意味着向orders表添加一个索引,称为idx_customer_order_status,它包含三列:customer_id、order_date、status。
直接改变表结构非常方便。

2 使用CREATE INDEX进行调整 或者这个: sql CREATE INDEX idx_customer_order_status ONorders(customer_id, order_date, status);
两者效果相同,但CREATE INDEX语法更简单,适合新表建立索引。

2 必须注意列的顺序
1 . 最左前缀原则 联合索引(col1 ,col2 ,col3 )只能在以下情况下使用:
WHERE col1 = '值'
其中 col1 = '值' AND col2 = '值'
WHERE col1 = 'value' AND col2 = 'value' AND col3 = 'value'
如果跳过最左边的列,例如只检查 col2 或 col3 ,那么索引将是徒劳的。
所以,最左前缀的原则必须死记硬背。

2 如何调整列顺序
区分度高的列优先:用户ID、订单号等唯一值较多的列优先放置,快速缩小搜索范围。

等值查询列优先级:经常使用=或IN条件的列放在范围查询(>、<、BETWEEN)列的前面。

将低歧视性列放在前面:例如性别(只是两个值0/1 ),放在前面没有过滤效果。

3 多列索引和单列索引如何选择
1 . 多列索引的好处
高效的搜索路径:例如检查WHEREfirst_name='张'ANDlast_name='三',可以直接定位到联合索引(first_name,last_name),省去了索引合并的开销。

覆盖索引优化:如果查询涉及到索引列,如SELECTfirst_name,last_nameFROMusersWHEREfirst_name='Zhang',数据库可以直接从索引获取数据,减少I/O。

2 单列索引的陷阱 索引合并(例如同时使用idx_first_name和idx_last_name)需要额外的CPU开销,并且仅适用于简单的AND/OR条件。
复杂查询可能不如全表扫描。

4 创建联合索引时需要注意的事项
1 . 不要过度索引 每个索引都会占用磁盘空间并增加INSERT、UPDATE和DELETE的维护成本。
查询加速和写入性能之间需要权衡。
2 .警惕冗余索引 如果已经存在联合索引(A,B),则无需重复单列索引(A)。
联合索引已经包含A列信息。
3 .控制索引列数 MySQL 允许单个索引最多包含 1 6 列,但实际上建议使用 3 -5 列。
如果列越多,索引就会变宽,占用更多内存,导致缓存效率低。
4 .验证指标效果 使用EXPLAIN查看查询执行计划并确认是否使用了索引。
如果出现Using filesort或Usingtemporary,则可能需要优化索引或查询逻辑。
5 . 谨慎处理 OR 条件 联合索引对于 AND 条件很容易使用,但对于 OR 条件(例如 WHERE col1 = 'x' OR col2 = 'y')可能没用。
这时候就得考虑重写查询或者使用其他技巧了。

5 摘要
1 . 创建方法:优先使用CREATE INDEX或ALTER TABLE明确索引名称和列顺序。
2 .列顺序:遵循最左前缀原则,区分度高、查询等价的列优先。
3 、选择策略:当多列组合查询频繁时,优先考虑整合联合索引,实现高效搜索和覆盖索引优化。
4 .避免陷阱的指南:不要过度索引,不要冗余索引,或者有太多列。
始终使用 EXPLAIN 来验证索引效果。

就是这样。
说实话,当时我不明白为什么最左边的前缀如此重要。
我一直不明白,直到后来了解了更多。

深入浅析Mysql联合索引最左匹配原则

最左前缀匹配原理:创建复合索引 KEYtest_col1 _col2 _col3 on test (col1 ,col2 ,col3 ) 实际上创建了三个索引 (col1 ), (col1 ,col2 ), (col1 ,col2 ,col3 )。

查询将使用 SELECT FROM test WHERE col1 ='1 ' AND col2 ='2 ' 索引 (col1 ,col2 )。

注意: 1 .索引字段的顺序影响效率。
解释查看执行计划,优化器会推荐最优顺序。
2 .组合索引增加了写入开销和空间开销。
1 000W数据表,单个索引过滤1 00W,组合索引过滤1 W。

要点: 1 . 并非所有组合索引的条件都能被触发。
对 col2 的单独查询将触发索引类型扫描。
2 、Ref类型扫描需要有序数据,否则效率低。

实用提醒:对于ref类型扫描,优先使用组合索引。

如何实现MySQL底层优化:索引的高级最佳实践和维护策略