Mysql 索引基本操作和优化

149 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

什么是索引

索引(在MySQL中也叫“键key”)是存储引擎快速找到记录的一种数据结构。

索引类型

主键索引 PRIMARY KEY:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。注意:一个表只能有一个主键。

唯一索引 UNIQUE:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

ALTER TABLE table_name ADD UNIQUE (column) 唯一索引

ALTER TABLE table_name ADD UNIQUE (column1,column2) 唯一组合索引:

普通索引 INDEX 这是最基本的索引,它没有任何限制

ALTER TABLE table_name ADD INDEX index_name (column)

组合索引 INDEX:即一个索引包含多个列,多用于避免回表查询。

ALTER TABLE table_name ADD INDEX index_name(column1,column2, column3);

全文索引 FULLTEXT:也称全文检索,是目前搜索引擎使用的一种关键技术。

ALTER TABLE table_name ADD FULLTEXT (column);

删除索引::索引一经创建不能修改,如果要修改索引,只能删除重建。

DROP INDEX index_name ON table_name

索引设计的原则

适合索引的列是出现在where子句中的列,或者连接子句中指定的列;
2)基数较小的类,索引效果较差,没有必要在此列建立索引;
3)使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间;
4)不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

MySQL索引优化

重要概念:

基数: 单个列唯一键(distict_keys)的数量叫做基数。 通俗就是该列值去掉重复的剩下的总行数

SELECT COUNT(DISTINCT name),COUNT(DISTINCT gender) FROM user;

image.png

user表的总行数是5,gender列的基数是2,说明gender列里面有大量重复值,name列的基数等于总行数,说明name列没有重复值,相当于主键。

回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。回表次数太多会严重影响SQL性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。

索引优化