10. MySQL索引介绍

本文深入解析MySQL中的索引概念,包括其工作原理、优势与劣势、不同类型的索引(如单列索引、组合索引、全文索引等),以及何时创建和使用索引的最佳实践。
索引介绍

​ 索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

​ 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在 单独的索引文件中,也可能和数据一起存储在数据文件中)。

我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都 是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

索引的优势和劣势
1. 优势:
  • 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。 – 检索

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 --排序

    • 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
    • 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。
    • where 索引列在存储引擎层处理 索引下推 ICP
2. 劣势:
  • 索引会占据磁盘空间
  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还要保存或者更新对应的索引文件。
索引的分类
1. 单列索引
  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询 数据更快一点。 add index
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值. add unique index
  • 主键索引:是一种特殊的唯一索引,不允许有空值。 pk
2. 组合索引
  • 在表中的多个字段组合上创建的索引 add index(col1,col2…)
  • 组合索引的使用,需要遵循最左前缀原则(最左匹配原则)。
  • 一般情况下,建议使用组合索引代替单列索引(主键索引除外)。
3. 全文索引
  • 只有在MyISAM引擎、InnoDB(5.6以后)上才能使用,而且只能在CHAR,VARCHAR,TEXT类型字段上使用全文索 引。 fulltext

  • 优先级最高 先执行 不会执行其他索引

  • 存储引擎 决定执行一个索引

4. 空间索引

不做介绍,一般使用不到。

创建索引的场景
1. 哪些情况需要创建索引
  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引
  • 多表关联查询中,关联字段应该创建索引 on 两边都要创建索引
  • 查询中排序的字段,应该创建索引
  • 频繁查找字段 覆盖索引
  • 查询中统计或者分组字段,应该创建索引 group by
2. 哪些情况不需要创建索引
  • 表记录太少
  • 经常进行增删改操作的表
  • 频繁更新的字段
  • where条件里使用频率不高的字段
索引的使用
1. 创建索引
  • 单列索引之普通索引

    CREATE INDEX index_name ON table(column(length)) ;
    ALTER TABLE table_name ADD INDEX index_name (column(length)) ;
    
  • 单列索引之唯一索引

    CREATE UNIQUE INDEX index_name ON table(column(length)) ; 
    alter table table_name add unique index index_name(column);
    
  • 单列索引之全文索引

    CREATE FULLTEXT INDEX index_name ON table(column(length)) ; 
    alter table table_name add fulltext index_name(column)
    
  • 组合索引

    ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10)) ;
    
2. 删除索引
DROP INDEX index_name ON table
3. 查看索引
SHOW INDEX FROM table_name
优化MySQL索引是提高数据库查询性能的关键步骤之一。下面是一些优化MySQL索引的常用方法: 1. 分析查询和索引的执行计划:通过使用EXPLAIN语句来分析查询的执行计划,了解MySQL是如何使用索引的。可以查看是否使用了合适的索引索引是否覆盖了查询所需的列等。 2. 选择合适的数据类型:选择适当的数据类型可以减小索引的大小,提高查询效率。例如,对于字符串类型的列,可以使用最短的适当字符集和根据实际情况选择字符集和排序规则。 3. 创建合适的索引:根据查询的特点和频率,创建合适的索引。考虑到查询的选择性和覆盖度,选择合适的列作为索引,并根据查询的顺序和条件进行列顺序的选择和组合。 4. 删除不必要的索引:过多或不必要的索引会增加写操作的开销,并占用额外的存储空间。定期检查和删除不再使用或重复的索引,以减少索引维护的负担。 5. 使用覆盖索引:在查询中使用覆盖索引,即索引中包含了查询所需的所有列,避免了回表操作,可以提高查询性能。 6. 避免索引列上的函数操作:对索引列使用函数操作会导致无法使用索引,应尽量避免在索引列上进行函数操作。 7. 更新统计信息:MySQL会根据统计信息来优化查询计划。因此,定期更新索引的统计信息可以帮助MySQL选择更优的查询计划。 8. 注意索引和表的大小:索引和表的大小对查询性能有影响。较大的索引可能导致更多的磁盘I/O,而较大的表可能会增加查询的开销。可以考虑对较大的表进行分区或分表,以减少查询的范围和开销。 以上是一些常见的MySQL索引优化方法,根据具体的应用场景和需求,还可以进行更加细致的索引设计和性能调优。在实际使用中,可以结合实际情况进行测试和调整,以获得最佳的查询性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值