Rumah > pangkalan data > tutorial mysql > mysql索引是什么及怎么使用的?整理的很详细

mysql索引是什么及怎么使用的?整理的很详细

php是最好的语言
Lepaskan: 2018-07-30 17:08:36
asal
1518 orang telah melayarinya

学习mysql时,经常会遇见索引吧,到底什么是索引呢?之前我也只是模模糊糊的会使用,但是让我解释出来还真有点困难呢,所以呢趁着空闲时间就查阅了下书籍,以防以后有人问我,我就整理写了下,有点印象总归是好的,说不会也挺尴尬的,毕竟也接触这些有些年头了,废话不说了,apache php mysql 讲重点:

begin!

一、索引是什么

1.索引简介
索引其实是以文件形式存储在磁盘上的一种数据结构,索引检索需要磁盘I/O操作。与主存不同,磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨大的。

2.IO简介
IO在计算机中指 输入与输出,由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。生活例子: 需要记住关键的事情都需要写在笔记本上,需要的时候在拿出来看,每次去笔记本上看记录时就是IO,如果记忆好的人会记住这件事情,直接就能读出来,这就是缓存(计算机里面更加不能一直保存)。

二、索引算法

1.数据库基本都是使用B+Tree算法实现

2.数据库索引是使用磁盘I/O次数来评价索引结构的优劣

3.B-Tree
(1) B-Tree的定义,可知检索一次最多需要访问h-1个节点(根节点常驻内存)。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入

(2) 实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O

(3) 采用B-Tree存储结构,搜索时I/O次数一般不会超过3次,所以用B-Tree作为索引结构效率是非常高的,但是B-tree中的节点根据实际情况可以包含大量的关键字信息和分支

4.B+Tree
(1) B-Tree的搜索复杂度为O(h)=O(logdN),所以树的出度d越大,深度h就越小,I/O的次数就越少。B+Tree恰恰可以增加出度d的宽度,因为每个节点大小为一个页大小,所以出度的上限取决于节点内key和data的大小

(2) 由于B+Tree的内节点去掉了data,因此可以拥有更大的出度,从而拥有更好的性能

三、聚集索引与非聚集索引

1.聚簇索引
(1) 聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。聚簇索引要比非聚簇索引查询效率高很多

(3) 每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放

(4) Innodb的默认索引

2.非聚簇索引

(1) 非聚集索引,类似于图书的附录,那个专业术语出现在哪个章节,这些专业术语是有顺序的,但是出现的位置是没有顺序的。但是,一个表可以有不止一个非聚簇索引

(2) 实现原理就是使用叶子节点存储引用行的主键(可以说是聚集索引)

(3) 聚集索引是非聚簇索引的一种索引,即主+辅索引的索引方式,这种主+辅索引的好处是,当发生数据行移动或者页分裂时,辅助索引树不需要更新,因为辅助索引树存储的是主索引的主键关键字,而不是数据具体的物理地址

(4)所以非聚簇索引要访问两次索引

四、索引的类型

1.UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值

2.INDEX(普通索引):允许出现相同的索引内容

3.PROMARY KEY(主键索引):不允许出现相同的值

4.FULLTEXT INDEX(全文索引):可以针对值中的某个单词,但效率很差

5.组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一

五、索引技巧

1.索引不会包含有NULL的列

(1) 只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的

2.使用短索引

(1)对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作

3.索引列排序

(1) mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引

4.like语句操作

(1) 一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引

5.不要在列上进行运算

6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

7.索引要建立在经常进行select操作的字段上

(1) 这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求

8.索引要建立在值比较唯一的字段上

9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少

10.在where和join中出现的列需要建立索引

11.where的查询条件里有不等号(where column != …),mysql将无法使用索引

12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引

13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用

14.explain可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句

六、索引与锁

1.锁用到索引就是行锁,如果没有用到索引就是表锁,所以操作的数据必须用到锁才行

(1) 如果没有建立索引的话,在进行数据选取或者定位的时候是通过全表扫描的形式来进行的,这样就会形成表锁,要是有索引的话就会直接定位到指定的行,就是形成行锁,这里注意在更新数据时假如没用到索引也会全表扫描

end

这样内容大多都是我平时积攒的,有的不清楚的参考了网络和书籍,多多谅解!

相关文章:

mysql索引名称如何使用,在什么时候使用

什么是索引?Mysql目前主要的几种索引类型

相关视频:

索引简单介绍-六天带你玩转MySQL视频教程

Atas ialah kandungan terperinci mysql索引是什么及怎么使用的?整理的很详细. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan