您当前位置:优侠库 > 资讯攻略 >
来源:未知
2021-02-22 12:43:41 浏览: 分类:资讯攻略

MySQL 索引详解

本文介绍了数据库索引及其优缺点。详细介绍了mysql索引的特点和应用。分析了如何避免MySQL不可用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。

Index是一种特殊的文件(InnoDB数据表上的index是tables 空之间不可分割的一部分),它包含了指向数据表中所有记录的引用指针。

注意:

【1】指数不是万能的!

索引可以加快数据检索的速度,但会减慢数据修改的速度。每次修改数据记录时,都必须刷新索引。为了以某种方式弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的功能是在插入每个新记录和修改每个现有记录后,暂时停止MySQL刷新索引。索引的刷新将一直等到所有记录都被插入/修改。当一个数据表中需要插入很多新记录时,DELAY_KEY_WRITE选项的作用会非常明显。

[2]此外,索引将占用硬盘上相当多的空空间。

因此,应该只对最频繁查询和排序的数据列进行索引。注意,如果一个数据列包含许多重复的内容,对其进行索引不会有太大的实际效果。

理论上,可以为数据表中的每个字段建立一个索引,但是MySQL将同一个数据表中的索引总数限制为16个。

1.innodb数据表索引

与MyISAM数据表相比,索引对InnoDB数据的重要性要大得多。在InnoDB数据表中,索引对InnoDB数据表来说要重要得多。在InnoDB数据表上,索引不仅会起到查找数据记录的作用,同时也是数据行级锁机制的基础。"行级锁定&这意味着正在处理的单个记录在事务操作执行期间被锁定,不允许其他用户访问它们。此锁定将影响(但不限于)SELECT & hellip锁定共享模式、选择& hellipFOR UPDATE命令以及插入、更新和删除命令。

为了提高效率,InnoDB数据表的行级锁定实际上发生在索引上,而不是在数据表本身上。显然,数据行级锁定机制只有在相关数据表有合适的索引进行锁定时才能有效。

2.限制

如果有一个不等式符号(WEHERE coloum!= & hellip),MySQL将无法使用索引。

同样,如果函数(其中日(列)= & hellip),MySQL也将无法使用索引。

在JOIN操作中(需要从多个数据表中提取数据时),MySQL只能在主键和外键的数据类型相同时使用索引。

如果在WHERE子句的查询条件中使用了像和REGEXP这样的比较操作符,那么MySQL只能在搜索模板的第一个字符不是通配符的情况下使用索引。例如,如果查询条件像& lsquoabc % & rsquo,MySQL会使用索引;如果查询条件像& lsquo% abc & rsquo,MySQL不会使用索引。

在ORDER BY操作中,只有当排序条件不是查询条件表达式时,MySQL才使用索引。(但是,在涉及多个数据表查询中,即使索引可用,这些索引对加快ORDER BY也没有什么影响)

如果一个数据列包含很多重复值,那么即使是索引也不会有很好的效果。例如,如果数据列包含所有数据,如“0/1 & Prime;或者“是/否& quot等价的,不需要为它创建索引。

公共索引、唯一索引和主索引。

1.总索引

普通索引(由键或索引定义)的唯一任务是加快对数据的访问。因此,只有那些最常出现在查询条件中的(其中column = & hellip)或ORDER BY列中的数据列。只要有可能,就应该选择具有最整洁和最紧凑数据的数据列(如整数类型数据列)来创建索引。

2.唯一索引

普通索引允许索引数据列包含重复值。例如,因为人们可能有相同的姓名,所以相同的姓名在同一个“员工档案”中可能会在数据表中出现两次或更多次。
如果确定数据列只包含彼此不同的值,则在为此数据列创建索引时,应该使用关键字UNIQUE将其定义为唯一索引。这样做有以下好处:第一,简化了MySQL对这个索引的管理,使得这个索引更加高效;第二,在数据表中插入新记录时,MySQL会自动检查新记录的这个字段的值是否已经出现在某条记录的这个字段中;如果是,MySQL将拒绝插入新记录。换句话说,唯一索引可以保证数据记录的唯一性。事实上,在很多场合,创建唯一索引的目的往往不是为了提高访问速度,而是为了避免数据重复。

3.主要索引

之前已经多次强调,必须为主键字段创建索引,这称为“主索引”。主索引和唯一索引之间的唯一区别是前者定义中使用的关键字是PRIMARY而不是UNIQUE。

4.外键索引

如果为外键字段定义了外键约束,MySQL将定义一个内部索引来帮助它以最有效的方式管理和使用外键约束。

5.复合指标

一个索引可以覆盖多个数据列,比如INDEX(columnA,columnB)。这个索引的特点是MySQL可以选择性地使用一个这样的索引。如果查询操作只需要columnA数据列上的一个索引,可以使用复合索引INDEX(columnA,columnB)。但是,这种用法仅适用于在复合索引中排名第一的数据列的组合。例如,INDEX(A,B,C)可以用作A或(A,B)的索引,但不能用作B,C或(B,C)的索引。

本文链接:http://www.123down.cn/gonglue/227263.html

攻略资讯
安卓软件
安卓游戏