应将哪个MySQL列设置为索引

时间:2014-12-18 02:11:56

标签: mysql database select optimization indexing

我收到了服务器主机发来的电子邮件,告诉我必须优化我的数据库请求,这些请求似乎太慢了。

实际上,我在Wordpress中使用了很多自定义请求,这些请求指向" wp_postmeta"表。这并不理想,因为你必须处理表格结构。

以下是' wp-postmeta'中的列。表:

meta_id    (table id)
post_id    (related post which is a foreign key)
meta_key   (name of the parameter)
meta_value (value of that parameter)

meta_id是表格的默认主键,默认情况下有 NO 索引由Wordpress设置。

我认为优化请求的最佳方式将是为这些列之一分配索引。

所以这是我最常见的请求:

SELECT meta_value FROM wp_postmeta WHERE meta_key = 'xxxx' and post_id = 1234 

知道:

  • 同一个post_id最多可以有15个不同的相关meta_key,大约有900个不同的post_id
  • 同样的meta_key在表记录上可以出现150次以上,无论post_id

这两列中的哪一列是表格索引的最佳选择: post_id meta_key

谢谢。

1 个答案:

答案 0 :(得分:2)

我建议根据您最常用的声明创建基于两列的索引 是

SELECT FROM wp_postmeta WHERE meta_key = 'xxxx' and post_id = 1234

MySQL有关于这个主题的一些很好的文档:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

CREATE INDEX index_postmeta_postmeta ON wp_postmeta (post_id, meta_key)

但基本上,索引的作用以及你应该使用它的原因在这里解释:What is an index in SQL?

你当地友好的DBA应该为你做这一切BTW:)

另外,这是我个人的经验法则。我在表上的所有外键上创建索引,因为它通常是一个自然的查找列。所以我可能也会匆匆进入:

 CREATE INDEX index_postmeta_postid ON wp_postmeta (post_id)