Percona 5.6 InnoDB issue not using indexes correctly [urgent]

Hey guys, I just installed Percona 5.6 on my new CentOS 6.4 server. It’s a fast machine 32 core xenon, 72GB ram, 8x SAS RAID 10 setup. So far so good :slight_smile:

My old server is a bit less powerful, and was running MySQL 5.1 still. So this was quite an upgrade. But I’m having some issues with InnoDB, it is not using the indexes correctly on some tables it seems. Where on my old machine the same queries were running fine.

Both servers have the same database. I did a mysqldump on the old machine and imported it onto the new Percona 5.6 server. Indexes stayed the same. Both servers use the same my.cnf config settings.

Table items has indexes on: item_id, item_format, item_private and contains about 40 million rows.
Table formats has index on: format_id and contains about 250 rows.

SELECT
i.item_name, i.item_key, i.item_date, f.format_long
FROM
items i, formats f
WHERE
i.item_format = f.format_id
AND
i.item_private = 0
ORDER BY
i.item_id DESC LIMIT 8

On my old server this query takes about 0.0003 seconds. On the new server it takes over 100 seconds.

Query with EXPLAIN on OLD server. [TABLE=“class: wysiwyg_table_data wysiwyg_table_ajax”]
[TR]
[/TR]
[TR=“class: wysiwyg_table_odd, bgcolor: #FFFFFF”]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_not_null wysiwyg_table_nowrap, align: right”]1[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_not_null”]SIMPLE[/TD]
[TD=“class: wysiwyg_table_inline_edit”]i[/TD]
[TD=“class: wysiwyg_table_inline_edit”]index[/TD]
[TD=“class: wysiwyg_table_inline_edit”]item_format[/TD]
[TD=“class: wysiwyg_table_inline_edit”]PRIMARY[/TD]
[TD=“class: wysiwyg_table_inline_edit”]4[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_null, align: right”]NULL[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_nowrap, align: right”]8[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_not_null”]Using where[/TD]
[/TR]
[TR=“class: wysiwyg_table_even wysiwyg_table_marked, bgcolor: #B6C6D7”]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_not_null wysiwyg_table_nowrap, align: right”]1[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_not_null”]SIMPLE[/TD]
[TD=“class: wysiwyg_table_inline_edit”]f[/TD]
[TD=“class: wysiwyg_table_inline_edit”]eq_ref[/TD]
[TD=“class: wysiwyg_table_inline_edit”]PRIMARY[/TD]
[TD=“class: wysiwyg_table_inline_edit”]PRIMARY[/TD]
[TD=“class: wysiwyg_table_inline_edit”]4[/TD]
[TD=“class: wysiwyg_table_inline_edit”]dbname.i.item_format[/TD]
[TD=“class: wysiwyg_table_inline_edit wysiwyg_table_nowrap, align: right”]1[/TD]
[/TR]
[/TABLE]

Query with EXPLAIN on NEW [problem] server. [TABLE=“class: wysiwyg_table_ajax wysiwyg_table_pma_table”]
[TR]
[TD] [/TD]
[/TR]
[TR=“class: wysiwyg_table_odd”]
[TD=“class: wysiwyg_table_right wysiwyg_table_data wysiwyg_table_not_null wysiwyg_table_nowrap”]1[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_not_null”]SIMPLE[/TD]
[TD=“class: wysiwyg_table_data”]f[/TD]
[TD=“class: wysiwyg_table_data”]ALL[/TD]
[TD=“class: wysiwyg_table_data”]PRIMARY[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_null”]NULL[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_null”]NULL[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_null”]NULL[/TD]
[TD=“class: wysiwyg_table_right wysiwyg_table_data wysiwyg_table_nowrap”]219[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_not_null”]Using temporary; Using filesort[/TD]
[/TR]
[TR=“class: wysiwyg_table_even, bgcolor: #DFDFDF”]
[TD=“class: wysiwyg_table_right wysiwyg_table_data wysiwyg_table_not_null wysiwyg_table_nowrap”]1[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_not_null”]SIMPLE[/TD]
[TD=“class: wysiwyg_table_data”]i[/TD]
[TD=“class: wysiwyg_table_data”]ref[/TD]
[TD=“class: wysiwyg_table_data”]item_format[/TD]
[TD=“class: wysiwyg_table_data”]item_format[/TD]
[TD=“class: wysiwyg_table_data”]4[/TD]
[TD=“class: wysiwyg_table_data”]dbname.f.format_id[/TD]
[TD=“class: wysiwyg_table_right wysiwyg_table_data wysiwyg_table_nowrap”]3026[/TD]
[TD=“class: wysiwyg_table_data wysiwyg_table_not_null”]Using where[/TD]
[/TR]
[/TABLE]
You can see that it’s using temporary and filesort. This seems to be the reason for the slowness.

Any idea how I could resolve this issue?

I suggest to try it with STRAIGHT_JOIN or with index hint (USE INDEX or FORCE INDEX) to check if it changes the query execution path first.
From the docs:
“STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.”


SELECT
i.item_name, i.item_key, i.item_date, f.format_long
FROM
formats f STRAIGHT_JOIN items i
ON f.format_id = i.item_format
WHERE
i.item_private = 0
ORDER BY i.item_id DESC LIMIT 8

OR


SELECT
i.item_name, i.item_key, i.item_date, f.format_long
FROM
items i, formats f USE INDEX(PRIMARY)
WHERE
i.item_format = f.format_id
AND
i.item_private = 0
ORDER BY
i.item_id DESC LIMIT 8

As you mentioned the query EXPLAIN output changed between MySQL versions it needs to check for changelog in documentation to verify what exactly changed between the versions. Also did you checked the same query EXPLAIN result on version 5.5 ?