什么是索引?
索引是存储引擎用于快速找到记录的一种数据结构,是一种以特定顺序保存的专用表。不过索引并不包含实体中的所有数据,而是包含那些用于定位表中行的列,以及描述这些行的物理位置的信息。
要理解 MySQL 中索引是如何工作的,最简单的方法就是去看看一本书的 “索引” 部分:如果想在一本书中找到某个特定主题,一般会先看书的目录页,即 “索引”,找到对应的页码,然后就可以找到想看的内容。
所有 MySQL 列类型都可以被索引,根据存储引擎可以定义每个表的最大索引数和最大索引长度,每种存储引擎(如 InnoDB、MyISAM、MEMORY、BDB 等)对每个表至少支持 16 个索引,总索引长度至少为 256 字节。大多数存储引擎有更高的限制。
为什么要使用索引?
通常我们在查找一个序列中的某一个元素时,用到的最简单的方式就是遍历,数据库也是一样,在一张表中查找某一行数据时,如果不考虑索引的状况下,也会采用一个逐行扫描的方式,只不过数据库通常以块或者页为单位,所以它通常将整个块或者页加载进内存,然后逐块轮询查找到结果并返回。
如果数据库中只有少量数据,那么进行全表扫描,速度还是会很快,但是如果在数据量很大的表中,这种方法就不再适用了,在数据量很大的表中,由于逐行扫描代价变大,通常需要避免采用这种逐行扫描的方式进行数据查找,数据库为了使查询变得高效,所以引入了索引这种方式对数据进行查找。
索引的优点
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车,跑起来速度天差地别。
举个例子:
# 表 article 目前只有一个主键id,status与hits并没有建立索引
select count(*) from article where `status` = 0 and hits > 50;
下面对它进行explain分析:
mysql> explain select count(*) from article where `status` = 0 and hits > 50;
+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows