文章目录:
什么是索引
在数据之外,数据库还维护着满足特定查找的数据结构,这些数据结构以某种特定方式指向数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。因此MySQL官方对索引的定义为:索引 (Index) 是帮助MySQL高效获取数据的数据结构。
从官方定义中我们可以看出:
- 索引的本质为:索引为数据结构。即排好序的快速查找数据结构。
- 索引的目的在于提高查找效率,可以类比字典。
即索引可以帮我们快速定位到数据的位置,而不用我们一个一个的从前往后扫描查询数据。就像图书馆中的每个图书都有一个编号,我们可以根据相应编号直接去对应位置找到该书。
mysql 使用的索引结构有: BTree 索引、Hash索引、full-text全文索引、R-Tree索引, 一般情况下BTree结构最为常用。
如下面例子所示,我们建立一张表格books
为了加快查找,我们使用索引如下图,其中第一列Col1为id,第二列Col2为bookname,左边为数据存储的物理地址,右边为我们使用索引的数据结构。由此可得我们可以根据Col2快速的定位到数据存储的位置。
例如查询bookname=77的数据时:
SELECT id, bookname FROM books where bookname = 77;
索引列位于bookname,因此 mysql 会使用索引查找 bookname 为 77 的行。首先查找 root 不为77, 因此去比它大的右子树中查找。。。。。。。。。。。
索引的优势劣势
优势:
- 类似大学图书馆书目索引,提高数据检索的效率,降低数据库的IO成本
- 通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
劣势:
- 虽然索引大大提高了查询数据,同时降低了更新表的速度,如对表进行INSERT,UPDATE 和DELETE。 因为更新表时, MYSQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引的字段。
哪些情况下需要建立索引:
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系创建索引
4、频繁更新的字段不适合创建索引
5、Where 条件用不到的字段不创建索引
6、单键/组合索引的选择问题 (在高并发的情况下创建组合索引)
7、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度。
8、查询中统计或者分组的字段
哪些情况下不需要建立索引:
1、表记录太小
2、经常增删改的表
3、数据重复且分布平均的字段,因此应该只为经常查询和经常排序的数据列建立索引。
MYSQL 索引分类:
单值索引:一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列
基本语法:
CREATE [UNIQUE] INDEX indexname ON mytable(columnname(LENGTH));
ALTER mytable ADD [unique] INDEX [indexname] ON (columnname(LENGTH));
删除索引:
DROP INDEX [indexname] ON mytable;
查看索引:
SHOW INDEX FROM table_name;
添加数据表索引的四种方式:
添加主键,这意味着索引值必须是唯一的,且不为NULL
ALTER TABLE tbl_name ADD PRIMARY KEY(column_list)
创建索引值必须是唯一的(除了NULL可能出现多次)
ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)
添加普通索引,索引值可能出现多次
ALTER TABLE tbl_name ADD INDEX index_name(column_list)
指定索引值为FULLTEXT 用于全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list)