2014-03-05 120 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