MySQL索引使用简单总结

本文介绍了MySQL索引的基本执行原理,包括左匹配原则、主键查询与回表查询的影响,以及如何优化查询效率。同时,阐述了索引创建的基本规范,如优先使用组合索引、控制索引数量、选择合适字段大小以及主键查询的重要性。通过理解这些原则,可以有效提升数据库性能并避免不必要的性能瓶颈。

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

1.mysql索引基本执行

        1、左匹配原则。

        2、查询字段包含主键,走主键索引。

        3、查询字段不包含主键,有走正常的索引字段A,查询里面包含非A的字段,则会出现回表查询,走一次主键索引查询到非A的字段。

        4、凡是回表索引都会产生二次索引查询从而导致查询效率变低。

2.mysql索引创建基本规范

   1、创建索引如果是能够使用组合索引尽量组合索引,目的是为了防止在编写代码的过程当中出现间隙锁,从而影响应用的性能,特别是高并发和复杂系统的情况。

   2、索引创建不是越多越好,越多只会导致插入变慢,原因是由于插入的时候需要针对索引创建一些索引数据从而导致数据库表锁时间变长。参考值最大5-8个左右

   3、索引创建的字段不宜过大,过大会占用数据库的内存空间。最好是数字类和时间类的字段。

   4、查询语句使用索引过程当中尽量采用主键查询,若需要使用到自定义的索引则尽量可以保证查询当中只是显示索引字段的展示。

### MySQL 中聚合索引的有效使用方法和最佳实践 #### 1. **理解聚合索引的工作原理** 在MySQL中,聚合索引通常指的是复合索引(Composite Index),它由多个字段组成。当设计查询时,应遵循最左前缀原则[^5]。这意味着只有当查询条件从索引定义的第一个字段开始连续匹配时,才能充分利用整个索引。 例如,假设有一个复合索引 `(a, b, c)`: - 查询 `WHERE a = ? AND b = ?` 可以利用该索引。 - 如果缺少第一个字段,则后续字段无法被索引支持,即 `WHERE b = ? AND c = ?` 不会触发索引[^5]。 --- #### 2. **避免不必要的回表操作** 回表是指在查询过程中,除了访问索引外还需要额外读取数据表中的记录。为了减少这种开销,可以通过构建覆盖索引来实现完全基于索引完成查询[^3]。 例如: ```sql CREATE INDEX idx_user_id ON orders(user_id); SELECT * FROM orders WHERE user_id = 3; ``` 此查询可能引发回表行为,因为索引仅包含 `user_id` 字段,而其他列需从主键索引中获取。改进建议如下: ```sql CREATE INDEX idx_covering_index ON orders(user_id, id, other_column); SELECT id, other_column FROM orders WHERE user_id = 3; ``` 这样可以显著降低I/O成本并提高性能。 --- #### 3. **注意范围查询的影响** 虽然复合索引能够加速多字段过滤,但如果某个中间字段涉及范围查询(如 `<`, `>`, `BETWEEN` 或者 `LIKE '%...'`),那么其右侧的所有字段都将失去索引效果。因此,在编写复杂查询时务必小心处理这些场景。 举个例子: ```sql -- 假设存在索引 (col_a, col_b, col_c) EXPLAIN SELECT ... FROM table_name WHERE col_a = 'value' AND col_b BETWEEN 10 AND 20 AND col_c = 'another_value'; ``` 这由于 `col_b` 使用了区间比较运算符 (`BETWEEN`) ,故即使后面还有等于约束条件也无法再继续应用剩余部分的索引结构[^1]。 --- #### 4. **防止因函数调用而导致索引失效** 某些情况下,开发者可能会错误地对带索引的列施加计算逻辑或者字符串截断之类的转换动作,从而使得原本有效的检索路径变得不可行[^4]。具体表现形式包括但不限于日期提取(`YEAR()`,`MONTH()`),大小写调整(UPPER(),LOWER()),以及数值四舍五入等操作。 解决办法很简单——尽量保持原始表达式的纯净度;如果确实有必要进行变换的话,则考虑创建虚拟列(virtual column) 并为其建立相应的辅助性次级索引。 --- #### 5. **合理评估执行计划的选择依据** 有时候即便某张表格已经设置了恰当类型的索引方案,但由于样本量较小或者其他因素干扰的缘故,查询优化器仍倾向于采用全扫描而非依赖特定的数据定位机制[^2]。此时可通过强制指定提示(force index/hint) 或者修改配置参数来干预默认决策流程。 不过需要注意的是,人为干涉往往伴随着风险,除非经过充分测试验证之后才推荐实施此类改动措施。 --- ### 总结 综上所述,要在MySQL充分发挥聚合索引的优势,就需要综合考量以下几个方面:一是严格遵守“最左优先”的规则设定合适的联合索引组合;二是精心挑选待返回的结果集项目列表以便达成覆盖目标;三是警惕任何可能导致原有布局崩溃的操作手法诸如嵌套子查询或是附加修饰后的属性引用等等最后还要学会解读explain命令输出的信息进而判断当前策略是否得当及时作出相应修正行动。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值