У меня есть две таблицы в MySQL, таблица1 имеет 1 013 347 объектов и 38 атрибутов, а таблица2 имеет 7343,905 сущностей и 10 атрибутов. В следующем запросе (который должен получить количество строк для разбивки на страницы) table1.ID - это PK, table2.ID - это его FK (оба индексируются), а предложение HAVING получает значение, если оно превышает определенный процент в этом случае 50%Чрезвычайно медленный запрос MySQL
SELECT SQL_CALC_FOUND_ROWS *
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID
WHERE table1.attribute1 LIKE 'D%'
GROUP BY table2.ID
HAVING (COUNT(table2.ID) * (100/18)) >= '50'
Даже в упрощенном состоянии, которое я разместил здесь, этот запрос занимает не менее 5 минут, чтобы запустить через командную строку. Я знаю, что я должен внести изменения в запрос, PHP-код (значения «50» и «D» назначаются через переменные PHP) и/или в мою конфигурацию MySQL, чтобы ускорить работу (я использую последний XAMPP с настройками по умолчанию). Любая помощь будет принята с благодарностью.
EDIT1: Все атрибуты TINYTEXT, за исключением атрибутов ID, которые являются VARCHAR (9).
edit2: EXPLAIN SELECT ... возвращается:
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| 1 | SIMPLE | table2 | ALL | NULL | NULL | NULL | NULL | 7343905 | Using temporary; Using filesort |
| 1 | SIMPLE | table1 | ref | ID | ID | 29 | func | 1 | Using where |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
2 rows in set (0.00 sec)
Что вы получаете, когда вы «ОБЪЯСНИТЕ ВЫБРАТЬ ...»? –
Это не повлияет на производительность, но не приводит цифры, '50'', в конце концов, это вас позовут. Плюс обязательный кодирующий ужас [ссылка «Пагинация мертва»] (http://www.codinghorror.com/blog/2012/03/the-end-of-pagination.html). – Ben
Вы указали таблицу1.attribute1, с которым вы делаете 'LIKE'? – Marc