2014-03-05 158 views
0

我有一個帶有2K個寄存器InnoDB引擎的MySql表。前兩個字段是名爲idPRIMARY KEY (AUTO INCREMENT)和名爲codregINDEX KEY VARCHAR(255)主鍵vs主鍵索引速度

在我的表格只有一個PRIMARY KEY (VARCHAR(6))之前,調用codreg

問題是在新配置中,codreg(like)的搜索比唯一的codreg配置慢。

主鍵索引是否比關鍵索引更快?

這個問題是關係到我在做這個查詢

SELECT CE.*, GI.* FROM ($_q_aux) CE inner join table2 GI ON GI.codreg=CE.codreg 

$ _q_aux性能問題是:

SELECT codreg FROM table2 WHERE codreg like '%string%' 

表1是2K項和表2 20K條目

執行時間太慢..

+0

感謝您的編輯,有人可以幫我嗎? – Hanzo

+0

即使你沒有說你使用了哪個引擎,答案是 - 是的,PK比正常指數「更快」。此外,'LIKE'搜索是非常無效的,它的執行方式(無論是否有效)是值得懷疑的,再加上一個用於PK的varchar很可能不會產生最佳性能。您可以優化您的搜索,使其更快捷。即使沒有索引。 2k條目對於MySQL來說是一個巨大的損失。 –

+0

InnoDb是引擎。實際上PK是一個自動增量 – Hanzo

回答

0

他們基本上是一樣的東西。但你真正的問題是你使用varchar爲PK - 爲什麼? 你應該使用一些像INT這樣的整數類型,你會看到很棒的性能改進。

如果你真的需要有這樣的列varchar,那麼首先檢查你是否知道字段的確切長度,如果你知道它,那麼你應該使用char(6)。請注意,如果您將「%」僅放在最後一個位置上,那麼當您進行LIKE搜索時,您的搜索速度會更快,否則它們將掃描每一行。因此,如果您可以使用WHERE codreg,如「123%」,而不是「%123%」

+0

你在混合有效和無效的建議,這就是爲什麼我沒有downvote或upvote你。但是你錯誤的主要原因是說「他們基本上是同一件事」。是的,索引一個數字或一個字符串可歸結爲同樣的事情,內心深處。但是,區別在於索引結構是如何物理組織的(在InnoDB和TokuDB中)。這就是差異所在,以及與其他類型的索引(如果它們是非集羣的)相比,PK幾乎總能產生更大的速度。 –

+0

對原始問題添加新信息 – Hanzo

+0

我試過使用'string%',但性能沒有提高。如果只嘗試查詢「SELECT codreg FROM table2 WHERE codreg like'%string%'」,那麼性能很好,但問題是當我執行查詢時「SELECT CE。*,GI。* FROM($ _q_aux)CE inner連接表2 GI ON GI.codreg = CE.codreg「...任何想法解決它?謝謝 – Hanzo