EXPLAIN解释命令查看sql语句中索引是否生效
explain select * form `table_name` where id=10
EXPLAIN列的解释:
- table:显示这一行的数据是关于哪张表的
- type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
- possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
- key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
- key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
- ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
- rows:MYSQL认为必须检查的用来返回请求数据的行数
- Extra:关于MYSQL如何解析查询的额外信息。
索引重要性
对一个数据库较大的表创建合适的索引,由此索引的唯一性,可以在很大程度上加快数据检索速度、加快表与表之间的连接、减少查询中分组与排序的事件,从而提高系统性能。但是索引并不是多多益善,因此创建和维护需要耗费时间,而索引也需要占用很大的物理空间,是以空间来换取速度的一种机制,另外更新表时索引也要相应修改。合理的索引能帮助你很大的提高查询效率,但不当的索引也有可能会拖慢查询,尤其是建立复合索引时更要谨慎。
一、索引创建原则:
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段(例如数据类型为text或ntext的字段),不要建索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
二、复合索引注意事项:
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;
- 正确选择复合索引中的主列字段,一般是选择性较好的字段;
- 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
ALTER TABLE索引创建
索引表名:table_name
索引名称:index_name
1.PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE (`column` )
3.INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
5.多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
CREATE索引创建
1.UNIQUE(唯一索引)
mysql>CREATE UNIQUE INDEX index_name ON `table_name` (`column` )
2.INDEX(普通索引)
mysql>CREATE INDEX index_name ON `table_name` ( `column` )
3.多列索引
mysql>CREATE INDEX index_name ON `table_name` ( `column1`, `column2`, `column3` )
删除索引
1.PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` DROP PRIMARY KEY
3.INDEX(普通索引)或UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` DROP INDEX index_name
mysql>DROP INDEX index_name ON `talbe_name`
查看索引
mysql> show index from table_name;
mysql> show keys from table_name;
索引分类
前缀索引
ALTER table 表名 add index title_pre(列名(100))
列名后面的数字代表前缀的长度,前缀长度并不是越长越好,这里涉及到一个选择性问题,
select count(distinct 列名)/count(*)as a,COUNT(DISTINCT left(列名,100)) as b, COUNT(DISTINCT left(列名,110)) as c from 表名
来查看选择性高低,选择性越高代表索引价值越高
- 前缀索引:通长索引开始部分的字符串,这样可以大大节约索引空间,从而提高索引效率。
对于text类型或者很长的varchar类型的列,必须使用前缀索引