[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-mysqlsuoyinyouhuashizhanshenrulijiezuizuoqianzhuipipeiyuanze":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":11,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":16,"seoDescription":17,"source":13,"sourceUrl":13,"publishTime":18},"2004169834944851970","MySQL索引优化实战：深入理解最左前缀匹配原则","mysqlsuoyinyouhuashizhanshenrulijiezuizuoqianzhuipipeiyuanze","在数据库优化领域中，索引是提升查询性能的关键工具，而**最左前缀匹配原则**则是高效使用联合索引的核心原则。本文将深入解析这一原则的原理、应用场景及实战技巧。 ## 1. 索引基础与最左前缀原则概述 ### 1.1 什么是联合索引 联合索引（复合索引）是指包含多个列的索引。例如，我们可以为`users`表的`first_name`和`last_name`列创建联合索引： ```sql CREATE INDEX idx_name ON users(first_name, last_name); ``` 与单列索引不同，联合索引按照定义时的列顺序构建B+树结构。 ### 1.2 最左前缀原则的核心概念 最左前缀原则指的是：**MySQL在使用联合索引时，只能从索引的最左列开始匹配，且必须是连续的列序列**。这意味着查询条件必须包含联合索引的最左列，才能有效利用该索引。...","在数据库优化领域中，索引是提升查询性能的关键工具，而**最左前缀匹配原则**则是高效使用联合索引的核心原则。本文将深入解析这一原则的原理、应用场景及实战技巧。\n\n## 1. 索引基础与最左前缀原则概述\n\n### 1.1 什么是联合索引\n\n联合索引（复合索引）是指包含多个列的索引。例如，我们可以为`users`表的`first_name`和`last_name`列创建联合索引：\n\n```sql\nCREATE INDEX idx_name ON users(first_name, last_name);\n```\n\n与单列索引不同，联合索引按照定义时的列顺序构建B+树结构。\n\n### 1.2 最左前缀原则的核心概念\n\n最左前缀原则指的是：**MySQL在使用联合索引时，只能从索引的最左列开始匹配，且必须是连续的列序列**。这意味着查询条件必须包含联合索引的最左列，才能有效利用该索引。\n\n举例来说，对于索引`(a, b, c)`：\n- ✅ 有效的查询：`WHERE a = 1`、`WHERE a = 1 AND b = 2`、`WHERE a = 1 AND b = 2 AND c = 3`\n- ❌ 无效的查询：`WHERE b = 2`、`WHERE c = 3`、`WHERE b = 2 AND c = 3`\n\n## 2. 最左前缀原则的底层原理\n\n### 2.1 B+树索引结构\n\nMySQL的索引通常采用B+树数据结构。在联合索引中，数据首先按照第一列排序，当第一列值相同时，按第二列排序，以此类推。\n\n例如，对于索引`(name, age, school)`：\n- `name`字段从小到大排序\n- 当`name`相同时，`age`从小到大排序\n- 当`age`相同时，`school`从小到大排序\n\n### 2.2 为什么需要最左前缀\n\n由于B+树只能选择一个字段作为主要排序键，因此**只有最左边的字段是有序的，后续字段仅在左边字段值相同的情况下有序**。如果查询条件不包含最左列，数据库无法利用索引的有序性进行快速定位，只能进行全表扫描。\n\n## 3. 最左前缀原则的实战场景分析\n\n### 3.1 全值匹配\n\n当查询条件包含索引的所有列时（无论顺序如何），MySQL优化器会自动调整条件顺序以利用索引：\n\n```sql\n-- 以下查询都能使用索引(a, b, c)\nSELECT * FROM table WHERE a = 1 AND b = 2 AND c = 3;\nSELECT * FROM table WHERE b = 2 AND a = 1 AND c = 3;\nSELECT * FROM table WHERE c = 3 AND b = 2 AND a = 1;\n\n```\n\n### 3.2 部分列匹配\n\n```sql\n-- 使用索引的情况\nSELECT * FROM students WHERE name = 'n_18';              -- 使用索引第一列\nSELECT * FROM students WHERE name = 'n_18' AND age = 20; -- 使用索引前两列\n\n-- 未使用索引的情况\nSELECT * FROM students WHERE age = 20;                   -- 跳过最左列，全表扫描\nSELECT * FROM students WHERE age = 20 AND school = 'ABC'; -- 跳过最左列，全表扫描\n\n```\n\n### 3.3 范围查询对索引的影响\n\n范围查询（`>`、`\u003C`、`BETWEEN`、`LIKE`）会导致**后续索引列失效**：\n\n```sql\n-- 只有name列使用索引，age索引失效\nSELECT * FROM students WHERE name > 'n_18' AND age = 20;\n\n-- name和age都能使用索引\nSELECT * FROM students WHERE name = 'n_18' AND age > 20;\n\n```\n\n**注意**：`BETWEEN`在某些情况下可能被优化为多个等值查询（IN），此时仍可能使用后续索引列。\n\n### 3.4 LIKE查询与最左前缀\n\n```sql\n-- 使用索引的情况\nSELECT * FROM table WHERE a LIKE 'As%';   -- 前缀匹配，使用索引\n\n-- 未使用索引的情况\nSELECT * FROM table WHERE a LIKE '%As';   -- 后缀匹配，全表扫描\nSELECT * FROM table WHERE a LIKE '%As%';  -- 中缀匹配，全表扫描\n\n```\n\n## 4. 高级应用技巧\n\n### 4.1 覆盖索引\n\n当查询的列都包含在索引中时，MySQL可以直接使用索引返回数据，避免回表操作：\n\n```sql\n-- 创建联合索引\nCREATE INDEX idx_name_phone ON user_innodb(name, phone);\n\n-- 使用覆盖索引的查询\nEXPLAIN SELECT name, phone FROM user_innodb WHERE name = '青山' AND phone = '13666666666';\n```\nExtra列显示\"Using index\"表示使用了覆盖索引。\n\n### 4.2 索引条件下推（ICP）\n\nMySQL 5.6+支持索引条件下推，将WHERE条件过滤下推到存储引擎层，减少回表次数：\n\n```sql\n-- 开启ICP\nSET optimizer_switch='index_condition_pushdown=on';\n\n-- 查询示例\nSELECT * FROM employees WHERE last_name='wang' AND first_name LIKE '%zi';\n```\n开启ICP后，存储引擎会先过滤`first_name`，仅对符合条件的记录回表。\n\n### 4.3 排序优化\n\n联合索引可以优化ORDER BY操作：\n\n```sql\n-- 使用索引排序的情况\nSELECT * FROM table ORDER BY a, b, c LIMIT 10;        -- 完全匹配索引顺序\nSELECT * FROM table WHERE a = 1 ORDER BY b, c LIMIT 10; -- 左边列等值查询，后面列排序\n\n-- 未使用索引排序的情况\nSELECT * FROM table ORDER BY b, c, a LIMIT 10;        -- 不匹配索引顺序\n\n```\n\n## 5. 索引设计最佳实践\n\n### 5.1 列顺序选择策略\n\n1. **高选择性列优先**：选择性高的列（不重复值多的列）应放在索引左侧\n2. **等值查询列优先**：经常用于等值查询的列应放在范围查询列之前\n3. **考虑查询频率**：最常用的查询条件应包含在索引的最左侧\n\n### 5.2 索引使用注意事项\n\n1. **避免索引列上的计算**：`WHERE price * 2 > 100` 会导致索引失效\n2. **避免隐式类型转换**：确保查询条件类型与列定义类型一致\n3. **谨慎使用OR**：OR连接的条件可能导致索引失效\n4. **索引不是越多越好**：索引会增加写操作开销和存储空间\n\n## 6. 实战案例：电商系统索引优化\n\n### 6.1 订单查询优化\n\n```sql\n-- 创建优化索引\nCREATE INDEX idx_customer_date ON orders(customer_id, order_date);\n\n-- 高效查询\nSELECT * FROM orders \nWHERE customer_id = 123 \nAND order_date BETWEEN '2024-01-01' AND '2024-12-31';\n```\n该查询先通过`customer_id`定位订单，再在结果内按`order_date`范围筛选。\n\n### 6.2 商品搜索优化\n\n```sql\n-- 前缀匹配优化\nSELECT * FROM products WHERE product_name LIKE 'keyword%';\n\n-- 避免全表扫描\nSELECT * FROM products WHERE product_name LIKE '%keyword%'; -- 全表扫描\n```\n对于复杂搜索需求，可结合Elasticsearch等专业搜索引擎。\n\n## 7. 总结\n\n最左前缀匹配原则是MySQL索引优化的核心原则，理解并正确应用这一原则可以显著提升查询性能。关键要点总结：\n\n1. **带头大哥不能死**：查询条件必须包含联合索引的最左列\n2. **中间兄弟不能断**：索引列必须连续使用，不能跳过中间列\n3. **范围之后全失效**：范围查询后的索引列无法使用索引\n4. **索引设计需权衡**：根据实际查询模式设计索引，平衡读写性能\n\n通过EXPLAIN分析查询计划，结合实际业务需求进行索引设计和优化，才能充分发挥MySQL索引的性能潜力。\n\n> 本文详细介绍了MySQL最左前缀原则的原理与应用，希望能够帮助您在数据库优化实践中取得更好的效果。如有疑问，欢迎在评论区交流讨论。","\u003Cp data-line=\"0\">在数据库优化领域中，索引是提升查询性能的关键工具，而\u003Cstrong>最左前缀匹配原则\u003C\u002Fstrong>则是高效使用联合索引的核心原则。本文将深入解析这一原则的原理、应用场景及实战技巧。\u003C\u002Fp>\n\u003Ch2 data-line=\"2\" id=\"1. 索引基础与最左前缀原则概述\">1. 索引基础与最左前缀原则概述\u003C\u002Fh2>\n\u003Ch3 data-line=\"4\" id=\"1.1 什么是联合索引\">1.1 什么是联合索引\u003C\u002Fh3>\n\u003Cp data-line=\"6\">联合索引（复合索引）是指包含多个列的索引。例如，我们可以为\u003Ccode>users\u003C\u002Fcode>表的\u003Ccode>first_name\u003C\u002Fcode>和\u003Ccode>last_name\u003C\u002Fcode>列创建联合索引：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"8\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">CREATE\u003C\u002Fspan> INDEX idx_name \u003Cspan class=\"hljs-keyword\">ON\u003C\u002Fspan> users(first_name, last_name);\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"12\">与单列索引不同，联合索引按照定义时的列顺序构建B+树结构。\u003C\u002Fp>\n\u003Ch3 data-line=\"14\" id=\"1.2 最左前缀原则的核心概念\">1.2 最左前缀原则的核心概念\u003C\u002Fh3>\n\u003Cp data-line=\"16\">最左前缀原则指的是：\u003Cstrong>MySQL在使用联合索引时，只能从索引的最左列开始匹配，且必须是连续的列序列\u003C\u002Fstrong>。这意味着查询条件必须包含联合索引的最左列，才能有效利用该索引。\u003C\u002Fp>\n\u003Cp data-line=\"18\">举例来说，对于索引\u003Ccode>(a, b, c)\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cul data-line=\"19\">\n\u003Cli data-line=\"19\">✅ 有效的查询：\u003Ccode>WHERE a = 1\u003C\u002Fcode>、\u003Ccode>WHERE a = 1 AND b = 2\u003C\u002Fcode>、\u003Ccode>WHERE a = 1 AND b = 2 AND c = 3\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli data-line=\"20\">❌ 无效的查询：\u003Ccode>WHERE b = 2\u003C\u002Fcode>、\u003Ccode>WHERE c = 3\u003C\u002Fcode>、\u003Ccode>WHERE b = 2 AND c = 3\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"22\" id=\"2. 最左前缀原则的底层原理\">2. 最左前缀原则的底层原理\u003C\u002Fh2>\n\u003Ch3 data-line=\"24\" id=\"2.1 B+树索引结构\">2.1 B+树索引结构\u003C\u002Fh3>\n\u003Cp data-line=\"26\">MySQL的索引通常采用B+树数据结构。在联合索引中，数据首先按照第一列排序，当第一列值相同时，按第二列排序，以此类推。\u003C\u002Fp>\n\u003Cp data-line=\"28\">例如，对于索引\u003Ccode>(name, age, school)\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cul data-line=\"29\">\n\u003Cli data-line=\"29\">\u003Ccode>name\u003C\u002Fcode>字段从小到大排序\u003C\u002Fli>\n\u003Cli data-line=\"30\">当\u003Ccode>name\u003C\u002Fcode>相同时，\u003Ccode>age\u003C\u002Fcode>从小到大排序\u003C\u002Fli>\n\u003Cli data-line=\"31\">当\u003Ccode>age\u003C\u002Fcode>相同时，\u003Ccode>school\u003C\u002Fcode>从小到大排序\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 data-line=\"33\" id=\"2.2 为什么需要最左前缀\">2.2 为什么需要最左前缀\u003C\u002Fh3>\n\u003Cp data-line=\"35\">由于B+树只能选择一个字段作为主要排序键，因此\u003Cstrong>只有最左边的字段是有序的，后续字段仅在左边字段值相同的情况下有序\u003C\u002Fstrong>。如果查询条件不包含最左列，数据库无法利用索引的有序性进行快速定位，只能进行全表扫描。\u003C\u002Fp>\n\u003Ch2 data-line=\"37\" id=\"3. 最左前缀原则的实战场景分析\">3. 最左前缀原则的实战场景分析\u003C\u002Fh2>\n\u003Ch3 data-line=\"39\" id=\"3.1 全值匹配\">3.1 全值匹配\u003C\u002Fh3>\n\u003Cp data-line=\"41\">当查询条件包含索引的所有列时（无论顺序如何），MySQL优化器会自动调整条件顺序以利用索引：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"43\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 以下查询都能使用索引(a, b, c)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> a \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> b \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> c \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> b \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> a \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> c \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> c \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> b \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> a \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"51\" id=\"3.2 部分列匹配\">3.2 部分列匹配\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"53\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 使用索引的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> name \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;n_18&#x27;\u003C\u002Fspan>;              \u003Cspan class=\"hljs-comment\">-- 使用索引第一列\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> name \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;n_18&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> age \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">-- 使用索引前两列\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-comment\">-- 未使用索引的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> age \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>;                   \u003Cspan class=\"hljs-comment\">-- 跳过最左列，全表扫描\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> age \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> school \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;ABC&#x27;\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">-- 跳过最左列，全表扫描\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"64\" id=\"3.3 范围查询对索引的影响\">3.3 范围查询对索引的影响\u003C\u002Fh3>\n\u003Cp data-line=\"66\">范围查询（\u003Ccode>&gt;\u003C\u002Fcode>、\u003Ccode>&lt;\u003C\u002Fcode>、\u003Ccode>BETWEEN\u003C\u002Fcode>、\u003Ccode>LIKE\u003C\u002Fcode>）会导致\u003Cstrong>后续索引列失效\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"68\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 只有name列使用索引，age索引失效\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> name \u003Cspan class=\"hljs-operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;n_18&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> age \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-comment\">-- name和age都能使用索引\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> students \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> name \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;n_18&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> age \u003Cspan class=\"hljs-operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"77\">\u003Cstrong>注意\u003C\u002Fstrong>：\u003Ccode>BETWEEN\u003C\u002Fcode>在某些情况下可能被优化为多个等值查询（IN），此时仍可能使用后续索引列。\u003C\u002Fp>\n\u003Ch3 data-line=\"79\" id=\"3.4 LIKE查询与最左前缀\">3.4 LIKE查询与最左前缀\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"81\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 使用索引的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> a \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;As%&#x27;\u003C\u002Fspan>;   \u003Cspan class=\"hljs-comment\">-- 前缀匹配，使用索引\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-comment\">-- 未使用索引的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> a \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;%As&#x27;\u003C\u002Fspan>;   \u003Cspan class=\"hljs-comment\">-- 后缀匹配，全表扫描\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> a \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;%As%&#x27;\u003C\u002Fspan>;  \u003Cspan class=\"hljs-comment\">-- 中缀匹配，全表扫描\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"91\" id=\"4. 高级应用技巧\">4. 高级应用技巧\u003C\u002Fh2>\n\u003Ch3 data-line=\"93\" id=\"4.1 覆盖索引\">4.1 覆盖索引\u003C\u002Fh3>\n\u003Cp data-line=\"95\">当查询的列都包含在索引中时，MySQL可以直接使用索引返回数据，避免回表操作：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"97\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 创建联合索引\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">CREATE\u003C\u002Fspan> INDEX idx_name_phone \u003Cspan class=\"hljs-keyword\">ON\u003C\u002Fspan> user_innodb(name, phone);\n\n\u003Cspan class=\"hljs-comment\">-- 使用覆盖索引的查询\u003C\u002Fspan>\nEXPLAIN \u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> name, phone \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> user_innodb \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> name \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;青山&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> phone \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;13666666666&#x27;\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"104\">Extra列显示&quot;Using index&quot;表示使用了覆盖索引。\u003C\u002Fp>\n\u003Ch3 data-line=\"106\" id=\"4.2 索引条件下推（ICP）\">4.2 索引条件下推（ICP）\u003C\u002Fh3>\n\u003Cp data-line=\"108\">MySQL 5.6+支持索引条件下推，将WHERE条件过滤下推到存储引擎层，减少回表次数：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"110\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 开启ICP\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SET\u003C\u002Fspan> optimizer_switch\u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&#x27;index_condition_pushdown=on&#x27;\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-comment\">-- 查询示例\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> employees \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> last_name\u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&#x27;wang&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> first_name \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;%zi&#x27;\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"117\">开启ICP后，存储引擎会先过滤\u003Ccode>first_name\u003C\u002Fcode>，仅对符合条件的记录回表。\u003C\u002Fp>\n\u003Ch3 data-line=\"119\" id=\"4.3 排序优化\">4.3 排序优化\u003C\u002Fh3>\n\u003Cp data-line=\"121\">联合索引可以优化ORDER BY操作：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"123\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 使用索引排序的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">ORDER\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">BY\u003C\u002Fspan> a, b, c LIMIT \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>;        \u003Cspan class=\"hljs-comment\">-- 完全匹配索引顺序\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> a \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">ORDER\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">BY\u003C\u002Fspan> b, c LIMIT \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">-- 左边列等值查询，后面列排序\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-comment\">-- 未使用索引排序的情况\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">table\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">ORDER\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">BY\u003C\u002Fspan> b, c, a LIMIT \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>;        \u003Cspan class=\"hljs-comment\">-- 不匹配索引顺序\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"133\" id=\"5. 索引设计最佳实践\">5. 索引设计最佳实践\u003C\u002Fh2>\n\u003Ch3 data-line=\"135\" id=\"5.1 列顺序选择策略\">5.1 列顺序选择策略\u003C\u002Fh3>\n\u003Col data-line=\"137\">\n\u003Cli data-line=\"137\">\u003Cstrong>高选择性列优先\u003C\u002Fstrong>：选择性高的列（不重复值多的列）应放在索引左侧\u003C\u002Fli>\n\u003Cli data-line=\"138\">\u003Cstrong>等值查询列优先\u003C\u002Fstrong>：经常用于等值查询的列应放在范围查询列之前\u003C\u002Fli>\n\u003Cli data-line=\"139\">\u003Cstrong>考虑查询频率\u003C\u002Fstrong>：最常用的查询条件应包含在索引的最左侧\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"141\" id=\"5.2 索引使用注意事项\">5.2 索引使用注意事项\u003C\u002Fh3>\n\u003Col data-line=\"143\">\n\u003Cli data-line=\"143\">\u003Cstrong>避免索引列上的计算\u003C\u002Fstrong>：\u003Ccode>WHERE price * 2 &gt; 100\u003C\u002Fcode> 会导致索引失效\u003C\u002Fli>\n\u003Cli data-line=\"144\">\u003Cstrong>避免隐式类型转换\u003C\u002Fstrong>：确保查询条件类型与列定义类型一致\u003C\u002Fli>\n\u003Cli data-line=\"145\">\u003Cstrong>谨慎使用OR\u003C\u002Fstrong>：OR连接的条件可能导致索引失效\u003C\u002Fli>\n\u003Cli data-line=\"146\">\u003Cstrong>索引不是越多越好\u003C\u002Fstrong>：索引会增加写操作开销和存储空间\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 data-line=\"148\" id=\"6. 实战案例：电商系统索引优化\">6. 实战案例：电商系统索引优化\u003C\u002Fh2>\n\u003Ch3 data-line=\"150\" id=\"6.1 订单查询优化\">6.1 订单查询优化\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"152\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 创建优化索引\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">CREATE\u003C\u002Fspan> INDEX idx_customer_date \u003Cspan class=\"hljs-keyword\">ON\u003C\u002Fspan> orders(customer_id, order_date);\n\n\u003Cspan class=\"hljs-comment\">-- 高效查询\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> orders \n\u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> customer_id \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">123\u003C\u002Fspan> \n\u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> order_date \u003Cspan class=\"hljs-keyword\">BETWEEN\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;2024-01-01&#x27;\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">AND\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;2024-12-31&#x27;\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"161\">该查询先通过\u003Ccode>customer_id\u003C\u002Fcode>定位订单，再在结果内按\u003Ccode>order_date\u003C\u002Fcode>范围筛选。\u003C\u002Fp>\n\u003Ch3 data-line=\"163\" id=\"6.2 商品搜索优化\">6.2 商品搜索优化\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"165\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">sql\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-sql\" language=sql>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">-- 前缀匹配优化\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> products \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> product_name \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;keyword%&#x27;\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-comment\">-- 避免全表扫描\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">SELECT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">*\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">FROM\u003C\u002Fspan> products \u003Cspan class=\"hljs-keyword\">WHERE\u003C\u002Fspan> product_name \u003Cspan class=\"hljs-keyword\">LIKE\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&#x27;%keyword%&#x27;\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">-- 全表扫描\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"172\">对于复杂搜索需求，可结合Elasticsearch等专业搜索引擎。\u003C\u002Fp>\n\u003Ch2 data-line=\"174\" id=\"7. 总结\">7. 总结\u003C\u002Fh2>\n\u003Cp data-line=\"176\">最左前缀匹配原则是MySQL索引优化的核心原则，理解并正确应用这一原则可以显著提升查询性能。关键要点总结：\u003C\u002Fp>\n\u003Col data-line=\"178\">\n\u003Cli data-line=\"178\">\u003Cstrong>带头大哥不能死\u003C\u002Fstrong>：查询条件必须包含联合索引的最左列\u003C\u002Fli>\n\u003Cli data-line=\"179\">\u003Cstrong>中间兄弟不能断\u003C\u002Fstrong>：索引列必须连续使用，不能跳过中间列\u003C\u002Fli>\n\u003Cli data-line=\"180\">\u003Cstrong>范围之后全失效\u003C\u002Fstrong>：范围查询后的索引列无法使用索引\u003C\u002Fli>\n\u003Cli data-line=\"181\">\u003Cstrong>索引设计需权衡\u003C\u002Fstrong>：根据实际查询模式设计索引，平衡读写性能\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp data-line=\"183\">通过EXPLAIN分析查询计划，结合实际业务需求进行索引设计和优化，才能充分发挥MySQL索引的性能潜力。\u003C\u002Fp>\n\u003Cblockquote data-line=\"185\">\n\u003Cp data-line=\"185\">本文详细介绍了MySQL最左前缀原则的原理与应用，希望能够帮助您在数据库优化实践中取得更好的效果。如有疑问，欢迎在评论区交流讨论。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",3849,12,"0","",2,0,"索引,查询,列,使用,--","在数据库优化领域中，索引是提升查询性能的关键工具，而最左前缀匹配原则则是高效使用联合索引的核心原则。本文将深入解析这一原则的原理、应用场景及实战技巧。\n1. 索引基础与最左前缀原则概述\n1.1 什么是联合索引\n联合索引（复合索引）是指包含多个列的索引。","2025-12-25 20:38:21"]