关于数据库查询速度优化

本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。

原因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:注意点

复合索引

因为复合索引需要遵循最佳左前缀原则,这样会导致项目的其他的查询语句失败。请结合实际情况选择。

单列索引的影响评估

✅ 正面影响

  1. 对当前查询有帮助

    • 即使单独创建statuscreate_time索引,也能部分改善性能

    • 例如:ALTER TABLE listcall_order ADD INDEX idx_status (status)

  2. 不会破坏现有查询

    • 单列索引不会改变现有复合索引的最左前缀匹配规则

    • 其他查询可以继续使用原有的索引策略

  3. 灵活组合

    • 可以按需创建多个单列索引,查询优化器可能使用"索引合并"(index_merge)

❌ 潜在负面影响

  1. 写入性能下降

    • 每新增一个索引,INSERT/UPDATE/DELETE操作会变慢(需要维护更多索引结构)

    • 影响程度:通常<5%的性能下降(除非极高并发写入场景)

  2. 存储空间增加

    • 每个单列索引约占原表10-15%的额外空间

    • 对大型表可能有显著影响

  3. 优化器选择困难

    • 多个单列索引可能导致优化器选择次优执行计划

    • 可能需要使用FORCE INDEX提示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值