索引
1、索引是什么
索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
可以理解为“排好序的快速查找数据结构”
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,
这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
2、优势
类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
3、劣势
实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。
都会调整因为更新所带来的键值变化后的索引信息。
建立索引会占用磁盘空间的索引文件。
4、索引的分类
主键索引、唯一索引、普通索引、全文索引、组合索引
5、基本语法
1,INDEX(普通索引):
ALTER TABLE 'table_name' ADD INDEX index_name('col')
最基本的索引,没有任何限制
2,UNIQUE(唯一索引):
ALTER TABLE 'table_name' ADD UNIQUE('col')
与“普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
3,PRIMARY KEY(主键索引):
ALTER TABLE 'table_name' ADD PRIMARY KEY('col')
是一种特殊的唯一索引,不允许有空值。
4,FULLTEXT(全文索引):
ALTER TABLE 'table_name' ADD FULLTEXT('col')
仅可用于MyISAM和InoDB,针对较大的数据,生成全文索引很耗时耗空间
5,组合索引:
ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3')
为了更多的提高mysql效率可建立组合索引,遵循“最左前缀”原则。创建复合索引应该将最常用(频率)做限制条件的列放在最左边,一次递减。组合索引最左字段用in是可以用到索引的。相当于建立了col1,col1col2,col1col2col3三个索引
修改索引名称(mysql)
对于MySQL 5.7及以上版本,可以执行以下命令:
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name
对于MySQL 5.7以前的版本,可以执行下面两个命令:
ALTER TABLE tbl_name DROP INDEX old_index_name
ALTER TABLE tbl_name ADD INDEX new_index_name(column_name)
6、哪些情况需要创建索引
①主键自动建立唯一索引
②频繁作为查询条件的字段应该创建索引
③查询中与其他表关联的字段,外键关系建立索引
④频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
⑤WHERE条件里用不到的字段不创建索引
⑥单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
⑦查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
⑧查询中统计或者分组字段
7、哪些情况不要创建索引
①表记录太少
②经常增删改的表
提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、和DELETE。
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。
③注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
索引使用注意事项
1,不要滥用索引
①,索引提高查询速度,却会降低更新表的速度,因为更新表时,mysql不仅要更新数据,保存数据,还要更新索引,保存索引
②,索引会占用磁盘空间
2,索引不会包含含有NULL值的列
复合索引只要有一列含有NULL值,那么这一列对于此符合索引就是无效的,因此我们在设计数据库设计时不要让字段的默认值为NULL。
3,MySQL查询只是用一个索引
如果where字句中使用了索引的话,那么order by中的列是不会使用索引的
4,like
like '%aaa%'不会使用索引而like "aaa%"可以使用索引