• ADADADADAD

    mysql索引如何使用[ mysql数据库 ]

    mysql数据库 时间:2024-11-29 10:12:13

    作者:文/会员上传

    简介:

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

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    一、索引是什么

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

    mysql索引如何使用.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载