你了解索引吗?
1. 什么是索引?
1)MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构;
2)索引的本质:索引是数据结构,可以理解为排好序的快速查找数据结构,一般来说索引本身也很大,不可能全部存储于内存中,因此索引往往以索引文件的形式存储于磁盘文件上。
2. 索引的优势
1)类似于大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本;
2)通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗;
3. 索引的劣势
1)虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE;
2)因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加的索引列的字段,都会调整因为更新所带来的键值变化后的索引信息;
3)实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的;
4. 哪些情况下适合建立索引?
1)主键自动建立唯一索引;
2)频繁作为查询条件的字段应该创建索引;
3)查询中与其他表关联的字段,外键关系建立索引;
4)单键/组合索引的选择问题,组合索引性价比更高;
5)查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度;
6)查询中统计或者分组字段;
5. 哪些情况下不适合建立索引?
1)表字段太少(一般建议在表中数据有2000行时,建立索引);
2)经常增删改的表或者字段;
3)Where条件里用不到的字段不创建索引;
4)过滤性不好的不适合建立索引(过滤性不好即为区分度太差的字段,比如:性别)
6. 索引的分类
1)最常见的索引类型;确保数据记录的唯一性;确定特定数据记录在数据库中的位置,不允许有null值
2)唯一索引(UNIQUE)
避免同一个表中某数据列中的值重复;主键索引只能有一个,唯一索引可以有多个;
索引列的值必须唯一,且允许有null值;
3)组合索引(多个列联合索引)
组合索引遵循最左前缀的标准,专门用于组合搜索,其效率大于索引合并;
4)常规索引(INDEX)
快速定位特定数据;常加在查询条件的字段,不易添加太多的常规索引,影响数据的插入、更新和删除操作;
5)全文索引(FULLTEXT)
快速定位特定数据,只能用于MyISAM存储引擎的数据表,只能用于CHAR、VARCHAR、TEXT数据列类型,常使用大型数据集;
6)创建、删除索引
CREATE UNIQUE INDEX indexName ON mytable(username(length); // 直接创建索引
ALTER table mytable ADD UNIQUE indexName (username(length)); // 修改表结构
ALTER table tableName ADD INDEX indexName(columnName); // 修改表结构
DROP INDEX [indexName] ON mytable; // 删除索引
SHOW INDEXES FROM mytable; // 展示表的索引集合