在一个生产库上,没有创建索引,是不可思议的,当然你的索引创建的太多了、冗余了,更是不可思议的.恰当的索引能够提高你的数据库性能,反之则提高维护成本,下面就介绍一款工具,来分析你的mysql库的索引是不是有冗余,pt-duplicate-key-checker,它能从mysql表中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来,并生成删除重复索引的语句,非常方便.工具详细介绍请参考
官文:
直接上实例:
#
########################################################################
nigel.a1
#?dx_cd?is?a?left-prefix?of?dx_cd_b
#?Key?definitions:
#?KEY?◆dx_cd◆?(◆cd◆)
#?KEY?◆dx_cd_b◆
(◆cd◆,◆b◆),
#?Column?types:
◆b◆?varchar(100)?default?null
#?To?remove?this?duplicate?index,?execute:
ALTER?TABLE?◆nigel◆.◆a1◆?DROP?INDEX?◆dx_cd◆;
nigel.students
#?dx_n?is?a?left-prefix?of?dx_n_s
#?KEY?◆dx_n◆?(◆name◆),
#?KEY?◆dx_n_s◆
(◆name◆,◆score◆),
ALTER?TABLE?◆nigel◆.◆students◆?DROP?INDEX?◆dx_n◆;
#?Summary?of
indexes
#?Size?Duplicate?Indexes
#?Total
Indexes
索引覆盖是指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据.这种查询速度非常快,称为"索引覆盖"
索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多).所以呢对于一些长短不同的字节,我们会针对列中的值,从左往右截取部分,来建索引.但是:
①.:截的越短, 重复度越高,区分度越小, 索引效果越不好
所以,我们要在 ?区分度 ◆ 长度 ?两者上,取得一个平衡( distinct?去重 )
对于一般的系统应用区别度能达到 0.1 ,索引的性能就可以接受.
给字符串类型的字段建立索引效率不高,但是必须要经常查这个字段怎么建索引?
分析:优化思路是 不查,少查,查索引,少取.
我们现在必须要查,则只查索引,不查数据,得到id.
再用id去查具体条目. ?这种技巧就是延迟索引.
①.:对于覆盖索引,直接在索引上查询时,就是有顺序的, using index
我们的争取目标:取出来的数据本身就是有序的! 利用索引来排序,那么什么时候发生索引排序呢?即查询索引和order by的字段是同一个字段
?goods表中 cat_id与shop_price组成联合索引:
using where按照shop_price索引取出的结果,本身就是有序的
? ? ? ??select goods_id,cat_id,shop_price from goods order by click_count;
? ? ? ? ? ? using filesort用到了文件排序,即取出的结果再次排序
重复索引是指 在同1个列(如age), 或者顺序相同的几个列(age,school), 建立了多个索引,称为重复索引,重复索引没有任何帮助,只会增大索引文件,拖慢更新速度.
SHOW INDEX FROM tbl_name [FROM db_name]
例如,
mysql SHOW INDEX FROM mytable FROM mydb;
mysql SHOW INDEX FROM mydb.mytable;
SHOW KEYS是SHOW INDEX的同义词.您也可以使用mysqlshow -k db_name tbl_name命令列举一个表的索引.
SHOW INNODB STATUS语法
SHOW INNODB STATUS
SHOW INDEX会返回表索引信息.其格式与ODBC中的SQLStatistics调用相似.
SHOW INDEX会返回以下字段:
- Table
表的名称.
- Non_unique
如果索引不能包括重复词,则为0.如果可以,则为1.
- Key_name
索引的名称.
- Seq_in_index
索引中的列序列号,从1开始.
- Column_name
列名称.
- Collation
列以什么方式存储在索引中.在MySQL中,有值'A'(升序)或NULL(无分类).
- Cardinality
索引中唯一值的数目的估计值.通过运行ANALYZE TABLE或myisamchk -a可以更新.基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的.基数越大,当进行联合时,MySQL使用该索引的机会就越大.
- Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目.如果整列被编入索引,则为NULL.
- Packed
指示关键字如何被压缩.如果没有被压缩,则为NULL.
- Null
如果列含有NULL,则含有YES.如果没有,则该列含有NO.
- Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE).
- Comment
多种评注.
以上就是土嘎嘎小编为大家整理的mysql怎么查重复索引相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!