mysql索引学习1

1. 索引概述

  1. 什么是索引

    索引是帮助数据库快速检索数据的一种数据结构。mysql中,存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。索引可以包含一个或多个列,如果索引包含多个列(联合索引),那么列的顺序十分重要。


2. 索引类型

  1. 索引有多种类型,mysql中索引是在存储引擎层实现而不是服务器器层,所以不同的存储引擎的索引的工作方式并不一样,不是所有的存储引擎都支持所有类型的索引,即使多个存储引擎支持同一种索引,其底层实现也可能不同
  2. B-tree索引
    1. 不同的存储引擎有着不同的存储结构,如NDB集群存储引擎实际使用T-tree结构存储索引,而innodb则使用b+ tree。
    2. 适用查询类型
      1. 全值匹配
        • 匹配所有的索引列,如 select xx from yy where a = A and b = B and c = C,匹配联合索引(a,b,c)
      2. 匹配最左前缀
        • 联合索引的最左前缀匹配,如 select xx from yy where a = A ,匹配联合索引(a,b,c)
      3. 匹配列前缀
        • 字符串类型的列的前缀匹配(匹配字符串的前缀)
      4. 匹配范围值
        • 范围查询,如 select xx from yy where a > A1 and a < A2
      5. 精确匹配某一列并范围匹配另一列
        • 联合索引的最左前缀匹配,如 select xx from yy where a = A and b > B and c = C,匹配联合索引(a,b,c),只会用到(a,b)索引
      6. 只访问索引的查询(索引覆盖)
        • 查询访问的是索引列,直接进行索引覆盖,避免回表的操作
      7. 缺点
        1. 若不是按照索引列的顺序(最左前缀匹配),则无法使用索引
        2. 不能跳过索引中的列
        3. 如果查询中有某个列的范围查询,则该列之后的索引列无法使用
        4. insert和delete操作会引起B+ tree结果的分裂和合并操作,导致操作性能下降
    3. hash索引
      1. 适应场景:适合等值查询(hash表数据结构)
      2. 缺点:
        1. 无法满足联合索引的最左前缀匹配
        2. 无法进行索引覆盖
        3. 不适用于范围查询
        4. 不适用于数据的排序(hash的特点为让数据尽可能的分散)
        5. 当hash碰撞频繁时,数据的检索效率会下降

3. 索引的优点

  1. 索引一般能大大减少mysql服务器扫描的数据量
  2. 索引可以帮助服务器减少排序和临时表
  3. 索引可以将随机IO转化为顺序IO
  4. 索引是最好的性能解决方案吗?
    • 索引不总是最好的工具,只有当索引可以帮助存储引擎减少搜寻的数据量时带来的收益大于其带来的额外工作,索引才是有效的。

4. 创建高性能的索引

  1. 独立的列

    如果查询的列不是独立的,则mysql不会使用索引,独立的列指:不能是表达式的一部分或者函数的参数。

  2. 前缀索引与索引选择性

    当索引列为很长的字符串时,索引会变大且慢,此时可以使用hash索引,但有时并不能很好的解决问题,我们可以索引列的前一部分字符(即字符串前缀),这样减少了索引的占用空间,但是索引的选择性降低了,索引选择性为不重复的索引值和数据表的记录总数之比,选择性越高的索引,效率越高,因为可以过滤更多的数据行,如唯一索引(unique index)的选择性为1,性能最好。所以选择性最高索引应置为最左的列。

### 学习 MySQL 素引的基础知识 学习 MySQL索引涉及多个方面,包括理解其基本概念、创建方法以及最佳实践。以下是关于这些主题的详细介绍。 #### 基本概念 MySQL 中的索引是一种用于加速数据检索的技术结构。通过在表中建立索引,可以显著减少查询时间,尤其是在大数据量的情况下。然而,过多或不当使用的索引可能会增加写操作的时间开销[^1]。 #### 如何创建索引 可以通过 `CREATE INDEX` 或者修改表定义的方式创建索引。例如: ```sql -- 单列索引 CREATE INDEX idx_name ON table_name(column_name); -- 组合索引 CREATE INDEX combined_idx ON table_name(col1, col2); ``` 需要注意的是,在组合索引 `(col1, col2)` 中,如果仅针对第二列进行过滤 (`WHERE col2 = ...`) 而不包含第一列,则该索引可能不会被有效利用[^4]。 #### 使用场景分析 了解何时应该使用索引非常重要。对于某些复杂的 SQL 查询,比如带有子查询或者多表连接的情况,即使存在可用的索引也可能由于成本估算的原因而未被采用。例如,当 `IN` 条件中的值数量较多时,优化器可能会决定放弃索引转而执行全表扫描[^3]。 另外,在涉及到逻辑运算符如 `AND` 时需注意,尽管各个参与比较的字段都单独建立了索引,但实际运行过程中数据库引擎通常会选择其中一个作为访问路径,其余部分则依赖回表完成进一步筛选[^5]。 #### 性能调优技巧 为了最大化发挥索引的作用,可以从以下几个角度入手: - **定期审查慢日志**:找出那些消耗资源较大的SQL语句,并针对性地调整它们所关联的对象上的索引设置; - **避免不必要的排序动作**(`USING FILESORT`):尽量让查询能够直接按照现有索引顺序返回结果集,从而规避额外产生的磁盘I/O负担[^2]; - **合理设计复合键**:考虑到覆盖率等因素精心挑选构成联合索引的各项属性; 最后提醒一点就是随着业务发展不断变化的需求可能导致原先规划良好的方案变得不再适用,因此持续监控系统表现并适时作出相应改动是非常必要的。 ### 实践案例分享 假设有一个员工信息管理系统的场景下需要频繁查找特定姓名范围内的记录数统计情况,那么除了简单地给名字这一维度加常规B树形式外还可以考虑尝试全文搜索引擎插件或者其他更高级别的解决方案来满足更加苛刻的要求。 ```sql SELECT COUNT(*) AS count_result FROM employees WHERE MATCH(first_name,last_name) AGAINST('John Smith'); ``` 上述例子展示了如何借助MyISAM存储引擎特有的功能实现模糊匹配的同时保持较高的效率水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值