为何索引能提升查询速度

为何索引能提升查询速度

如下内容整理自: 地址: juejin.im/post/5b55b8… 做者 :Java3ysql

先从 MySQL 的基本存储结构提及

MySQL的基本存储结构是页(记录都存在页里边):bash

MySQL的基本存储结构是页

  • 各个数据页能够组成一个双向链表
  • 每一个数据页中的记录又能够组成一个单向链表
    • 每一个数据页都会为存储在它里边儿的记录生成一个页目录,在经过主键查找某条记录的时候能够在页目录中使用二分法快速定位到对应的槽,而后再遍历该槽对应分组中的记录便可快速找到指定的记录
    • 以其余列(非主键)做为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。

因此说,若是咱们写select * from user where indexname = 'xxx'这样没有进行任何优化的sql语句,默认会这样作:post

  1. 定位到记录所在的页:须要遍历双向链表,找到所在的页
  2. 从所在的页内中查找相应的记录:因为不是根据主键查询,只能遍历所在页的单链表了

很明显,在数据量很大的状况下这样查找会很慢!这样的时间复杂度为O(n)。性能

使用索引以后

索引作了些什么可让咱们查询加快速度呢?其实就是将无序的数据变成有序(相对):优化

要找到id为8的记录简要步骤:ui

很明显的是:没有用索引咱们是须要遍历双向链表来定位对应的页,如今经过 “目录” 就能够很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))spa

其实底层结构就是B+树,B+树做为树的一种实现,可以让咱们很快地查找出对应的记录。3d

关于索引其余重要的内容补充

如下内容整理自:《Java工程师修炼之道》code

最左前缀原则

MySQL中的索引能够以必定顺序引用多列,这种索引叫做联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,若是查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就能够被用到。以下:orm

select * from user where name=xx and city=xx ; //能够命中索引
select * from user where name=xx ; // 能够命中索引
select * from user where city=xx; // 没法命中索引            
复制代码

这里须要注意的是,查询的时候若是两个条件都用上了,可是顺序不一样,如 city= xx and name =xx,那么如今的查询引擎会自动优化为匹配联合索引的顺序,这样是可以命中索引的.

因为最左前缀原则,在建立联合索引时,索引字段的顺序须要考虑字段值去重以后的个数,较多的放前面。ORDERBY子句也遵循此规则。

注意避免冗余索引

冗余索引指的是索引的功能相同,可以命中 就确定能命中 ,那么 就是冗余索引如(name,city )和(name )这两个索引就是冗余索引,可以命中后者的查询确定是可以命中前者的 在大多数状况下,都应该尽可能扩展已有的索引而不是建立新索引。

MySQLS.7 版本后,能够经过查询 sys 库的 schema_redundant_indexes 表来查看冗余索引

Mysql如何为表字段添加索引???

1.添加PRIMARY KEY(主键索引)

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
复制代码

2.添加UNIQUE(惟一索引)

ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 
复制代码

3.添加INDEX(普通索引)

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
复制代码

4.添加FULLTEXT(全文索引)

ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 
复制代码

5.添加多列索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
复制代码

参考

相关文章
相关标签/搜索