惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
博客园 - 叶小钗
S
SegmentFault 最新的问题
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
L
Lohrmann on Cybersecurity
量子位
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
J
Java Code Geeks
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 三生石上(FineUI控件)
Attack and Defense Labs
Attack and Defense Labs
AI
AI
The Cloudflare Blog
T
Tailwind CSS Blog
S
Schneier on Security
爱范儿
爱范儿
PCI Perspectives
PCI Perspectives
Stack Overflow Blog
Stack Overflow Blog
S
Secure Thoughts
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
V2EX - 技术
V2EX - 技术
S
Securelist
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
K
Kaspersky official blog
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - 野码

使用C#实现ModbusTCP通信 使用C#实现ModbusRTU通信 Modbus协议TCP和RTU报文 UDP协议通信 TCP/IP 协议通信 SerialPort串口通信 MySql导致索引失效的原因 MySql性能调优之EXPLAIN 10.ChatGPT辅助产品维护与支持 9.ChatGPT辅助产品发布与运营 8.ChatGPT辅助产品测试与质量管理 7.ChatGPT辅助产品项目管理 6.ChatGPT辅助产品原型设计 5.ChatGPT辅助用户体验设计 4.ChatGPT辅助产品数据分析 3.ChatGPT辅助产品需求管理 2.2.市场调研与用户调查 2.1.竞争分析矩阵 2.使用ChatGPT辅助竞品分析与市场调研
MySQL 查询索引优化的常用方法
野码 · 2026-03-19 · via 博客园 - 野码

一、基本原则与索引类型

  • 理解索引代价:读快(查找、排序、分组) vs 写慢(插入/更新/删除需维护索引)。
  • 常用索引类型:
    • B-Tree 索引(默认,适合等值、范围查询、排序)
    • 哈希索引(Memory 引擎,等值查询)
    • 全文索引(FULLTEXT,文本搜索)
    • 前缀索引(字符串列做部分索引,节省空间)
    • 复合索引(多列联合,注意列顺序)
    • 覆盖索引(索引包含查询所需全部列,避免回表)

二、索引设计要点

  • 用最常用的查询字段建索引(WHERE、JOIN、ORDER BY、GROUP BY、DISTINCT)
  • 复合索引按查询中使用的列顺序和最左前缀原则设计:
    • 复合索引能被利用前提是查询条件包含最左列或前缀。
  • 避免在索引列上做函数或运算(如 DATE(col)、col+1),会导致索引失效。
  • 尽量用等值条件放在复合索引左侧,范围条件放右侧。
  • 小数据类型优于大数据类型;短字符串索引优于长字符串;适当使用前缀索引。
  • 主键最好为窄且稳定的列(自增整型常用)。

三、常见优化技巧

  • 覆盖索引(索引列包含所需的所有 SELECT 列)能显著提升性能。
  • 使用合适的 ORDER BY / LIMIT 配合索引,避免文件排序(Using filesort)。
  • 对 JOIN 操作,给连接字段建立索引,注意驱动表选择与索引选择。
  • 控制索引数量:索引过多影响写性能与维护成本,只保留必要索引。
  • 使用分区(Partition)处理极大数据表,注意只在合适场景下使用(按范围、列表或哈希分区)。
  • 使用稀疏/稠密索引策略:低基数列(如性别)通常不适合单独建索引,可与其他列组成复合索引。
  • 避免索引选择器被阻断:NULL 值、隐式类型转换(字符串与数值比对)会影响索引利用。
  • 对频繁更新的列慎用索引,评估写入性能影响。
  • 定期重建/优化索引(OPTIMIZE TABLE)或重建碎片严重的表(尤其 MyISAM)。

四、SQL 编写注意

  • 避免 SELECT *,明确列以便使用覆盖索引。
  • 使用 EXISTS 替代 IN(尤其子查询返回大量数据时),或使用 JOIN。
  • 对于 OR 条件,评估是否能改写为 UNION 或使用合适的复合索引。
  • 对于模糊匹配,前缀匹配(col LIKE 'abc%') 可用索引;'%abc%' 无法用普通 B-Tree 索引(可用 FULLTEXT 或倒排/ElasticSearch)。
  • 使用 LIMIT 时配合索引分页(基于索引的范围扫描优于 OFFSET 大值)。

五、诊断步骤与工具

  • 使用 EXPLAIN / EXPLAIN ANALYZE 查看查询执行计划:
    • 关注 key(使用的索引)、key_len、rows(估算扫描行数)、Extra(Using index, Using where, Using filesort, Using temporary)。
  • 使用 SHOW INDEX FROM table 查看索引定义与选择性(Cardinality)。
  • 查看慢查询日志(slow query log)定位耗时 SQL。
  • 使用 Performance Schema、INFORMATION_SCHEMA、pt-index-usage(percona-toolkit)等分析索引使用情况。
  • 使用 ANALYZE TABLE 更新统计信息,帮助优化器选择更好索引。

六、常见问题与解决方法

  • 索引没被使用:检查函数/算术操作、类型不一致、隐式转换、NULL、最左前缀未满足。
  • 查询使用文件排序(Using filesort):为 ORDER BY 列建立合适复合索引或调整查询顺序。
  • 大量低选择性索引:合并为复合索引或删除无效索引。
  • 回表(Using where 而非 Using index):尝试扩展索引包含更多所需列实现覆盖索引。
  • 过多索引导致写性能差:评估并删除不常用索引。

七、实践示例(简要)

  • 复合索引:对 WHERE a=? AND b=? 做索引:CREATE INDEX idx_a_b ON t(a,b);
  • 覆盖索引查询:SELECT a,b FROM t WHERE a=? 用 idx_a_b 可成为覆盖索引。
  • 避免函数:不要写 WHERE DATE(col)= '2026-01-01',改写为 WHERE col >= '2026-01-01' AND col < '2026-01-02'。
  • 分页优化:SELECT ... WHERE id > last_id ORDER BY id LIMIT 100 比 OFFSET 快。

八、优化流程建议

  1. 收集慢查询 -> 2. 用 EXPLAIN 分析 -> 3. 尝试添加/调整索引或改写 SQL -> 4. 复测 EXPLAIN/性能 -> 5. 部署并监控

posted @ 2026-03-19 15:54  野码  阅读(37)  评论()    收藏  举报