反复索引是指的在雷同的列上依据雷同的递次建立的雷同范例的索引,应当防止如许建立反复索引,发明今后也应当马上删除。但,在雷同的列上建立差别范例的索引来满足差别的查询需求是能够的。
CREATE TABLE test( ID INT NOT NULL PRIMARY KEY, A INT NOT NULL, B INT NOT NULL, UNIQUE(ID), INDEX(ID), ) ENGINE=InnoDB;
这段SQL建立了3个反复索引。一般并没有理由这么做。
冗余索引和反复索引有一些差别,假如建立了索引(a,b),再建立索引(a)就是冗余索引,因为这只是前面一个索引的前缀索引,因而(a,b)也能够看成(a)来运用,然则(b,a)就不是冗余索引,索引(b)也不是,因为b不是索引(a,b)的最左前缀列,别的,其他差别范例的索引在雷同列上建立(如哈希索引和全文索引)不会是B-Tree索引的冗余索引,而不管掩盖的索引列是什么。
冗余索引一般发作再为表增添新索引的时刻。比方,有人可能会增添一个新的索引(A,B)而不是扩大今后的索引(A)。另有一种状况是将一个索引扩大为(A,ID),个中ID是主键,关于InnoDB来讲主键已包含在二级索引中了,所以这也是冗余的。
大多数状况下都不须要冗余索引,应当只管扩大已有的索引而不是建立新索引,但也有时刻处于机能方面的斟酌须要冗余索引,因为扩大已有的索引会致使其变得太大,从而影响其他运用该索引的查询机能。如:假如在整数列上有一个索引,如今须要分外增添一个很长的varchar列来扩大该索引,那末性可能会急剧下降,特别是有查询把这个索引看成掩盖索引,或许这是myisam表而且有许多局限查询的时刻(因为myisam的前缀紧缩)
比方,有一张userinfo表。这个表有1000000条数据,对每一个state_id值大概有20000条纪录。在state_id有一个索引,那末下面的SQL我们称之为Q1
SELECT count(*) FROM userinfo WHERE state_id=5; --Q1
改查询的实行速率大概是每秒115次(QPS)
另有一个SQL,我们称之为Q2
SELECT state_id,city,address FROM userinfo WHERE state_id=5; --Q2
这个查询的QPS是10,提拔该索引机能最简朴的方法就是狂战索引为(state_id,city,address),让索引能掩盖查询:
ALERT TABLE userinfo ADD KEY state_id_2(state_id,city,address);
(注:state_id已有索引了,依据前面的观点,这是一个冗余索引而不是反复索引)
怎样找出冗余索引和反复索引呢?
1.能够运用Shlomi Noach的common_schema中的一些试图来定位,common_schema是一系列能够安装到服务器上的经常使用的存储和试图。
2.能够运用Percona Toolkit中的pt_duplicate-key-checker,该东西经由过程剖析表构造来找出冗余和反复的索引。
以上就是mysql中关于冗余和反复索引 的细致内容,更多请关注ki4网别的相干文章!