关于数据库查询速度优化
本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。
原因1:
老板需要我做一个首页的统计查询。明明才几十万条数据,而且我加了筛选条件为什么会这么慢,我之前接手做项目的时候,查询速度都是很快的。
解决思路
1:先查询数据库是什么版本的,因为数据库版本不对,底层也是不对的,或者支持语法也有一定差异。
通用版本查询(所有数据库兼容)
-- MySQL/MariaDB 专用
SELECT VERSION() AS database_version;
查看详细版本信息(MySQL 5.7+)
SHOW VARIABLES LIKE '%version%';
-- 关键输出示例:
-- version | 8.0.33
-- version_comment | MySQL Community Server
-- version_compile_os| Linux
高级版本信息(含补丁号)
SELECT @@GLOBAL.version, @@GLOBAL.version_comment;
2:使用查询计划 如果 了解这个数据库 可以不用查询数据库版本号
EXPLAIN 你的语句
3: 查询索引信新
/* 查看索引统计信息(5.7特有语法) */
SELECT
table_name,
index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS columns,
index_type,
non_unique
FROM
information_schema.statistics
WHERE
table_schema = '数据库名'
AND table_name IN ('表名', '表名')
GROUP BY
table_name, index_name, index_type, non_unique;
4:这个时候就可以选择适合自己的索引,单例或者复合
5:注意点
复合索引
因为复合索引需要遵循最佳左前缀原则,这样会导致项目的其他的查询语句失败。请结合实际情况选择。
单列索引的影响评估
✅ 正面影响
-
对当前查询有帮助:
-
即使单独创建
status
或create_time
索引,也能部分改善性能 -
例如:
ALTER TABLE listcall_order ADD INDEX idx_status (status)
-
-
不会破坏现有查询:
-
单列索引不会改变现有复合索引的最左前缀匹配规则
-
其他查询可以继续使用原有的索引策略
-
-
灵活组合:
-
可以按需创建多个单列索引,查询优化器可能使用"索引合并"(index_merge)
-
❌ 潜在负面影响
-
写入性能下降:
-
每新增一个索引,INSERT/UPDATE/DELETE操作会变慢(需要维护更多索引结构)
-
影响程度:通常<5%的性能下降(除非极高并发写入场景)
-
-
存储空间增加:
-
每个单列索引约占原表10-15%的额外空间
-
对大型表可能有显著影响
-
-
优化器选择困难:
-
多个单列索引可能导致优化器选择次优执行计划
-
可能需要使用
FORCE INDEX
提示
-