patternsqlMinor
MySQL: Index when joining to tables not being used (Performance optimizing question)
Viewed 0 times
tablesusedbeingquestionmysqloptimizingperformancewhenindexnot
Problem
I need to optimize the following query:
EXPLAIN SELECT gives me the following result:
Why does it first take the articles and then the blogposts? Is it because blogposts have more entries?
And how can I improve the query so that the articlepost can use an index?
Update:
An index is set on blogposts.date_created.
Removing the blogposts.title LIKE condition and the date_published <= NOW() doesn't do anything.
When I remove the "articles.id AS articleid" it can use the blogpost_id Index on articles...
Sounds strange to me, someone knows why? (because I actually need it..)
The new explain looks like this:
SELECT /* [things omitted] */ articles.blogpost_id, articles.id AS articleid
FROM blogposts
JOIN articles ON articles.blogpost_id = blogposts.id
WHERE blogposts.deleted = 0
AND blogposts.title LIKE '%{de}%'
AND blogposts.visible = 1
AND blogposts.date_published <= NOW()
ORDER BY blogposts.date_created DESC
LIMIT 0 , 50EXPLAIN SELECT gives me the following result:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles ALL blogpost_id NULL NULL NULL 6915 Using temporary; Using filesort
1 SIMPLE blogposts eq_ref PRIMARY PRIMARY 4 articles.blogpost_id 1 Using whereWhy does it first take the articles and then the blogposts? Is it because blogposts have more entries?
And how can I improve the query so that the articlepost can use an index?
Update:
An index is set on blogposts.date_created.
Removing the blogposts.title LIKE condition and the date_published <= NOW() doesn't do anything.
When I remove the "articles.id AS articleid" it can use the blogpost_id Index on articles...
Sounds strange to me, someone knows why? (because I actually need it..)
The new explain looks like this:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles index blogpost_id blogpost_id 4 NULL 6915 Using index; Using temporary; Using filesort
1 SIMPLE blogposts eq_ref PRIMARY PRIMARY 4 articles.blogpost_id 1 Using whereSolution
Your where condition
As to how to improve it, you might add an index on blogposts using the
blogposts.title LIKE '%{de}%' will cause a full table scan on the blogposts table. It's likely MySQL figures scanning 6915 articles is more efficient.As to how to improve it, you might add an index on blogposts using the
date_created or date_published and add a range the to the where condition (something other than <=NOW())Context
StackExchange Database Administrators Q#872, answer score: 4
Revisions (0)
No revisions yet.