本文共 1703 字,大约阅读时间需要 5 分钟。
索引是数据库查询性能的重要因素,但并非所有情况都适合使用。索引的基数是数据列中不同值的数量,基数越高,索引越有用。例如,包含多个不同年龄值的字段,索引会显著提升查询效率。而性别字段(如仅有“M”和“F”)由于值重复率高,索引的帮助不大,甚至可能引发全表扫描。
varchar
字段用于number
类型的where
条件,索引会被忽略。ROUND()
),需要建立基于函数的索引。MySQL 8.0支持直接索引函数字段,5.7可通过虚拟列实现。is null
和is not null
索引会失效。DESC
或EXPLAIN
分析SQL语句。EXPLAIN extended
查看实际执行计划,分析查询性能。where
条件可下推到存储引擎,提升查询效率。Using index
:覆盖索引。Using filesort
:MySQL无法利用索引排序。Using temporary
:查询涉及排序操作。impossible where
:where
条件总是错误,无法获取数据。select optimized away
:优化了MIN/MAX
或COUNT(*)
操作。distinct
:优化distinct
操作,早止重复值查找。type
: system
:系统表,常见于const
类型。const
:主键或唯一索引扫描。eq_ref
:唯一性索引扫描。ref
:非唯一性索引扫描。range
:基于范围条件的扫描。index
:全表索引扫描。all
:全表扫描。utf8
:最大支持3个字节,不支持emoji,需使用utf8mb4
。utf8mb4
:支持emoji,需在配置文件中指定客户端字符集,并在连接池中设置初始化SQL。utf8_general_ci
:大小写不敏感。utf8_bin
:区分大小写,常用于区分大小写敏感的场景。INSERT IGNORE INTO
。INSERT ... ON DUPLICATE KEY UPDATE
。REPLACE INTO
。CREATE TABLE ... SELECT ...
。CREATE TABLE ... LIKE ...
。LOCK IN SHARE MODE
。FOR UPDATE
。FORCE INDEX
。SQL_NO_CACHE
。where
而非having
。group by
优化。truncate
会重置自增基数。SUM(NULL)
返回NULL而非0。a = null
永远为false
,正确写法为a is null
。pt-online-schema-change
工具。通过以上优化,数据库性能将得到显著提升,建议结合实际业务场景,合理设计索引和查询策略,避免常见问题。
转载地址:http://phbfk.baihongyu.com/