У меня есть сервер RDS (rd3.medium) на AWS, на котором выполняется базовая конфигурация. Я пытаюсь выполнить этот запрос, который выполняется за несколько миллисекунд на моем локальном компьютере, а также на базовом веб-сервере, на котором у меня установлен сервер MySQL. Однако, когда я запускаю его на RDS, требуется 20 секунд. Я использую твердотельные накопители General Provisioned для хранения.
SELECT DISTINCT
p2.id
FROM
wp_posts p2
INNER JOIN
wp_postmeta pm2
ON
pm2.meta_key = 'wpcr3_review_post'
AND
pm2.post_id = p2.id
INNER JOIN
wp_posts p3
ON
p3.id = pm2.meta_value
AND
p3.post_status = 'publish'
INNER JOIN
wp_postmeta pm3
ON
pm3.meta_key = 'wpcr3_enable'
AND
pm3.meta_value = '1'
WHERE
p2.post_type = 'wpcr3_review'
Я заметил, когда бежал EXPLAIN
что он использует временную таблицу, и поэтому мне интересно, есть ли какой-то способ, которым RDS не справляется так хорошо, в то время как базовая установка сервера MySQL делает?
1 SIMPLE pm3 ref meta_key meta_key 576 const 334 Using where; Using temporary
1 SIMPLE pm2 ref post_id,meta_key meta_key 576 const 1335 Using where
1 SIMPLE p2 eq_ref PRIMARY,type_status_date PRIMARY 8 deaddictioncentres_staging.pm2.post_id 1 Using where
1 SIMPLE p3 eq_ref PRIMARY PRIMARY 8 deaddictioncentres_staging.pm2.meta_value 1 **Using index condition;** Using where; Distinct
Единственное отличие, которое я обнаружил на всех других серверах, это то, что сервер RDS добавляет Использование условия индекса; где никто из других не делает.
Обновить Я узнал разницу Использование условия индекса; был связан с переходом с 5.5 на 5.6. Но я не могу понять, почему переход с 5.5 на 5.6 сделает работу намного медленнее.
Вот и я понял ответ. Проблема была в неправильном дизайне запроса. (Этот запрос исходил из плагина Wordpress, поэтому это неудивительно). Третье соединение было не только бесполезным, оно добавляло «создание» 1 записи в результирующий набор для каждой записи в мета-таблице Post, для которой для wpcr3_enable было установлено значение 1 * для каждой записи в таблице WP Post, в результате получалось 500 000 строк. Я считаю, что скорость на локальном уровне была просто проблемой с отправкой / обработкой этих данных. Добавленное ключевое слово DISTINCT просто скрывает проблему и фактически не требуется в правильно закодированном запросе.