今天聊聊mysql的索引机制
索引的类型
mysql 索引的四种类型:主键索引
、唯一索引
、普通索引
和全文索引
。通过给字段添加索引
可以提高数据的读取速度
,提高项目的并发能力和抗压能力。索引优化
时 mysql 中的一种优化方式。索引的作用相当于图书的目录
,可以根据目录中的页码快速找到所需的内容
。
主键索引:
主键是一种唯一性索引,但它必须指定为PRIMARY KEY
,每个表只能有一个主键。
alter table table_name add primary key(`字段名`);
唯一索引:
索引列的所有值都只能出现一次,即必须唯一
,值可以为空
。
alter table table_name add unique index(`字段名`);
--删除旧索引再添加
alter table table_name drop index `字段名` , add unique index(`字段名`);
普通索引 :
基本
的索引类型,值可以为空,没有唯一性的限制。
alter table table_name add index(`字段名`);
全文索引:
全文索引的索引类型为FULLTEXT
。全文索引可以在varchar、char、text
类型的列上创建。可以通过ALTER TABLE
或 CREATE INDEX 命令创建。对于大规模的数据集,通过 ALTER TABLE(或者 CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。MyISAM
支持全文索引,InnoDB
在 mysql5.6 之后支持了全文索引
。
全文索引不支持中文
需要借sphinx(coreseek)
或迅搜<、code>技术处理中文。
alter table 表名 add FULLTEXT(`字段名`);
查看表的所有索引和删除
--查看:
show indexes from `表名`;
-- 或
show keys from `表名`;
--删除
alter table `表名` drop index 索引名;
索引的机制
1. 为什么我们添加完索引
后查询速度为变快
?
传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql 需要将表的数据从头到尾遍历一遍 在我们添加完索引之后,mysql 一般通过BTREE算法
生成一个索引文件
,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率)
,找到相应的键从而获取数据
2. 索引的代价
2.1 创建索引是为产生索引文件的,占用磁盘空间
2.2 索引文件是一个二叉树类型的文件
,可想而知我们的 dml 操作同样也会对索引文件进行修改,所以性能会下降
3. 在哪些 column 上使用索引?
3.1 较频繁的作为查询条件字段应该创建索引
3.2 唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如 gender 性别字段
3.3更新非常频繁的字段``不适合作为索引
3.4不会出现在where子句中
的字段不该创建索引
“总结: 满足以下条件的字段,才应该创建索引.
”
a: 肯定在 where 条经常使用
b: 该字段的内容不是唯一的几个值
c: 字段内容不是频繁变化
。
查看索引的使用情况
show status like '%Handler_read%' ;
handler_read_key: 这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next: 这个值越高,说明查询低效。
【扩展阅读】
链接:
https://www.zixuephp.net/article-342.html