优化MySQL SELECT查询?

时间:2011-06-16 20:15:13

标签: mysql sql optimization select

可以更改以下查询以提高其在“大型”数据库上的性能吗?

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts 
WHERE 1=1 
  AND ((guid = '956e208f101562f6654e88e9711276e4') 
   OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
   OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
   OR (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 
 AND wp_rb_posts.post_type 
   IN ('post', 'page', 'attachment', 'revision', 'nav_menu_item') 
 AND (wp_rb_posts.post_status = 'publish' 
        OR wp_rb_posts.post_status = 'future' 
        OR wp_rb_posts.post_status = 'draft' 
        OR wp_rb_posts.post_status = 'pending' 
        OR wp_rb_posts.post_status = 'trash' 
        OR wp_rb_posts.post_status = 'auto-draft' 
        OR wp_rb_posts.post_status = 'inherit' 
        OR wp_rb_posts.post_status = 'private') 
ORDER BY wp_rb_posts.post_date DESC LIMIT 1400, 10;

2 个答案:

答案 0 :(得分:2)

我将查看该查询的执行计划,然后确保您已设置索引以优化查询。根据执行计划,您可能还会看到重新排序部分查询将加快性能。

直接回答你的问题虽然着名的“它取决于”答案在这里有效。我必须看到你的数据库,运行查询,查看执行计划,查看索引的内容,并查看执行计划生成的子句的顺序如何影响性能等。

希望对你有所帮助。

答案 1 :(得分:0)

在不了解所涉及的表格的情况下,我根据查询中的字段名称进行猜测。我的猜测是查询中限制性最强的部分是guid=...部分。从查询结构中还可以看出,该字段的内容没有完全明确定义(有时它可能具有md5哈希值,有时不具有)。如果这是正确的,那么使用md5(guid) = '...'似乎意味着它无法有效地限制查询的那一部分。

所以如果可能的话,如果你的字段总是包含guid字段的md5哈希值,那么它似乎会使搜索更有效率。然后可以对该字段建立索引,并为查询的该部分提供更有效的查找。

为了澄清,请考虑以下问题:

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts WHERE
   (guid = '956e208f101562f6654e88e9711276e4') OR
   (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 

假设MySQL不允许使用标量函数的索引(我不认为这样做,如果我错了,那么这整个答案毫无意义),那么该查询将需要全表扫描计算{{1}在每条记录上。鉴于以下查询可以更好地优化(假设两个字段都存在索引:

md5(guid)