可以更改以下查询以提高其在“大型”数据库上的性能吗?
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;
答案 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)