mysql之索引优化案例二

本文探讨了SQL查询优化的两大核心策略:一是永远采用小表驱动大表的方法,通过小数据集来驱动大数据集,提高查询效率;二是针对orderby关键字进行优化,强调在索引列上完成排序操作的重要性,避免使用效率较低的filesort排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 永远小表驱动大表
    1)优化原则
           小表驱动大表,既小的数据集驱动大的数据集
    2)案例
       
       
  2. Order by 关键字优化
    1)order by子句,尽量index方式排序,避免使用filesort排序

    2)尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀


    3)如果不在索引列上,filesort有两种算法,mysql就要启动双路排序和单路排序

 

 

### MySQL 索引优化的实际案例 #### 创建和使用组合索引 在一个实际项目中,假设有一个 `users` 表用于存储用户信息。该表包含多个字段如 `id`, `name`, `age`, `gender`, 和 `city_id`。为了提高查询效率,在设计索引时选择了创建组合索引来满足常见的多条件联合查询需求。 对于经常使用的查询语句如下所示: ```sql SELECT id, name FROM users WHERE city_id = ? AND gender = ? ``` 针对上述SQL语句的特点,可以为 `(city_id, gender)` 列创建一个复合索引,这样当执行这类带有两个条件的查询时就能显著提升速度[^1]。 #### 使用 EXPLAIN 查看并分析查询计划 在实施任何索引调整之前,应该总是先运行 `EXPLAIN` 来观察当前查询是如何被执行的。这有助于理解现有索引的工作方式以及是否存在潜在改进空间。 例如,可以通过下面命令来检查上面提到的那个查询是否有良好表现: ```sql EXPLAIN SELECT id, name FROM users WHERE city_id = 123 AND gender = 'male'; ``` 理想情况下,输出结果中的 `key` 字段应显示所定义的组合索引名称;而在 `rows` 列则显示出预计扫描到的数据行数越少越好,表明更高效地利用到了索引结构。 #### 避免不等于操作影响索引效能 需要注意的是某些特定类型的比较运算符会对索引造成负面影响。特别是像 `!=` 或者 `NOT IN` 这样的否定表达式往往会使MySQL放弃使用已存在的索引路径,转而采取全表扫描的方式完成检索工作。因此应当尽量避免编写含有此类逻辑的操作[^2]。 #### 应用覆盖索引减少I/O开销 考虑到读取整条记录可能导致不必要的磁盘访问增加延迟时间,所以建议尽可能构建能够完全服务于目标查询请求所需的最小化索引集——也就是所谓的“覆盖索引”。这意味着只要通过一次索引树遍历即可获取全部所需数据项,无需再回到原始表去加载额外的信息片段[^3]。 例如,如果我们只需要返回用户的ID和名字,并且这两个属性已经被加入到了前面所说的组合索引里,则此时就可以享受到这种技术带来的好处了。 ```sql CREATE INDEX idx_city_gender ON users(city_id, gender); ALTER TABLE users ADD COLUMN nickname VARCHAR(50); -- 原始查询可能会触发回表动作 SELECT id, name FROM users WHERE city_id = 123 AND gender = 'female'; -- 修改后的版本尝试利用覆盖索引特性 SELECT id, name FROM users USE INDEX (idx_city_gender) WHERE city_id = 123 AND gender = 'female'; ``` 以上便是几个有关于MySQL索引优化的具体实践例子,它们展示了如何基于业务特点合理规划索引策略从而达到更好的性能指标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值