MySQL索引与优化

一、索引的概述与分类

什么是索引?
MySQL官方定义:
索引是(Index)是帮助的MySQL高效获取数据的数据结构,我们可以理解为快速查找排好序的一种数据结构。
索引类似于图书的目录索引,可以提高检索的效率,降低数据库的IO成本。

索引的分类:

  • 主键索引
    即主索引,根据主键建立,不允许重复,不允许空值;如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。
  • 唯一索引
    用来建立索引时的列的值必须是唯一的,允许空值。
  • 普通索引
    用表中的普通列构建的索引,没有任何限制。
  • 全文索引
    用大文本对象的列构建的索引。
  • 组合索引
    用多个列表组合构建的索引,这是多个列表的值不允许有空值。
    组合索引的最左原则

总结:
索引就像是一本书的目录是为了提高检索的速度。
在MySQL中有不同的索引类型,要求和效率也不一样

二、索引原理-索引与B+Tree
哈希索引
B+TREE索引

只有menory(内存) 存储引擎支持哈希索引,哈希索引用索隐裂的值计算该值的hashCode,然后在hashCode相应的位置存该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是只能一个值只能对应一个hashcode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。正藏情况下,如果不指定索引,那么一般是指B+Tree索引(或者B+t Tree索引)。
存储引擎以不同的方式使用B+Tree索引。性能也各有不同,但是InnoDB按照原数据格式进行存储。

B+Tree 就是B+树,而B+Tree就是通过B树演变过来的,所以想知道什么是B+树,那么就要了解什么是b树,要了解b树呢就得知道二叉树,这些都是数据结构的内容,那么数据结构是啥呢?数据结构是计算机存储。组织数据的方式。数据结构是指相互之间存在一种或者多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或存储效率。数据结构往往同更高效的检索算法和索引技术有关。

顺序查找:就是从第一个元素开始,按索引顺序遍历待查找序列,直到找出给定目标或查找失败

缺点:效率低–需要遍历整个待查序列

二分查找:也称为折半查找,是一种在有序数组中查找特定元素的搜索算法。

二叉树也存在缺点,就是当数据是顺序插入时就会改变树的形态(在非完全二叉树的时候)

平衡二叉树经过条件的控制,在通过旋转的方式,完成树的平衡,不过,旋转次数过多。

红黑树
在平衡二叉树稳定性下的基础上,在优化一下,减少旋转次数,保证树的平衡性。树的查找性能,取决于树的高度,让树尽可能平衡,就是为了降低树的高度。

当数据存在内存中,红黑树效率非常高,但是文件系统和数据库都是存在硬盘上的,如果数据量大的话,不一定能一次性加载到内存。

所以一棵树都无法一次性加载到内存,又如何谈查找。因此就出现了专为磁盘等存储设备而设计的一种平衡多路查找树,也就是B树 ,与红黑树相比,在相同的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度。

B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树、B_树。
B树是一种自平衡树状数据结构,一般较多用于存储系统上,比如数据库或文件系统。
1、磁盘读写代价更低
B树的数据和索引都在同一个节点上,那么每个块中包含的索引是少量的,如果想要取出比较深层的数据,意味着要读取更多的块,才能得到更多的索引和数据,那么就增加了IO次数。
而B+树每个块中存储的索引是B树的很多倍,那么获取比较深层的数据,也只需要读取少量的块就可以,那么减少了磁盘的IO次数。

2、随机IO的次数更少
随机 I/O 是指读写操作时间连续,但是访问地址不连续,时长约为10ms。
顺序 I/O 是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据,时长约为0.1ms

相同情况下,B树要进行更多的随机I/O,而B+树需要更多的顺序I/O,因此B+树,效率也更快。
3、查询速度稳定
由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度是相同的,因此所有数据的查询速度是一样的。

总结:
数据库中,索引是为了提高数据的检索速度的,而索引是基于B+Tree的数据结构实现的。
而使用B+Tree的好处是:
1、降低了磁盘读写代价。
2、顺序I/O提高效率
3、查询速度更稳定

聚簇索引 和非聚簇索引
索引分聚簇索引和非聚簇索引两种。
在索引的分类中,我们可以按照索引的主键来分为“主索引”和“辅助索引”
使用主键键值建立的索引称为“主索引”,其他的称为“辅助索引”。
因此索引只能有一个,辅助索引可以有很多个。

聚簇索引:索引即数据,数据即索引。
非聚簇索引:找到索引仅仅是找到的当前索引值和key值如果需要索引外的内容,则需要回表。
以上都以InnoDB表引擎为基础

MyISAM和InnoDB的区别
数据存储方式:
InnoDB有两种文件组成,表结构,数据和索引
MyISAM有三种文件组成,表结构、数据、索引

索引的方式:
索引的底层都是基于B+Tree的数据结构建立
InnoDB中主键索引为聚簇索引,辅助索引是非聚簇索引

事务的支持:
InnoDB支持事务
MyISAM不支持事务

三、慢查询与优化
MySQL的慢查询。全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中相应时间超过阈值的语句。默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。如果不是调优需要的话,一般不建议启动该参数,开启慢查询日志或多或少带来一定的性能影响。

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引优化提高查询性能的关键。下面是一些优化MySQL索引的方法: 1. 选择合适的索引 索引并非越多越好,需要根据实际情况选择合适的索引。通常来说,可以根据以下几个原则来选择索引: - 对经常查询的列进行索引 - 对频繁用于WHERE、JOIN、ORDER BY和GROUP BY子句的列进行索引 - 对选择性高的列进行索引(即不同值越多的列) 2. 删除不必要的索引 过多的索引会占用过多的磁盘空间并降低写操作的性能,因此需要删除不必要的索引。可以使用如下语句查询所有的索引,并根据实际情况删除不必要的索引: ``` SHOW INDEX FROM table_name; ``` 3. 避免全表扫描 全表扫描是指MySQL查询时没有使用索引,而是扫描整个表的数据。全表扫描会导致查询效率低下,因此需要避免全表扫描。可以通过优化查询语句,例如添加索引、改变表结构等方式来避免全表扫描。 4. 使用覆盖索引 覆盖索引是指查询语句只需要使用索引中的列就可以返回查询结果,而不需要再去查询表中的数据。覆盖索引可以减少查询的IO操作,提高查询效率。 5. 定期维护索引 索引需要定期维护,包括优化查询语句、删除不必要的索引、重新构建索引等。可以使用MySQL自带的OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。 以上就是MySQL索引优化的一些方法,需要根据实际情况进行选择和优化。需要注意的是,不同的索引优化策略对于不同的数据库环境和数据结构可能会有所不同,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值