У меня есть запрос MySQL 5.0, который регулярно занимает более 14 секунд, вызывается с веб-страницы, и пользователи нетерпеливы. Это довольно просто — выбрать 11 столбцов из 2 таблиц. У меня три вопроса:
- Имеет ли значение место соединения?
- Имеет ли значение порядок предложения where или MySQL будет оптимизировать?
- Поможет ли и индекс в моем случае?
SQL:
select table1.id, table1.DateOpened, table1.Status, table2.Name, etc
from (table1 join table2 on((table1.CurrentName = table2.id)))
where table1.Type = 'Add' and (Status = 'Open' OR Status = 'Pending');
информация о таблице/столбце:
table1 has 750,000 rows, table2 1.5M rows.
indexed: table1.id, table2.id
INT columns: id, table1.CurrentName
table1.Status = always populated with 1 of 4 values,
maybe 300 are 'Open' or 'Pending'
table1.Type = 3 possible values: 'Add', 'Change', or null
Есть ли какое-либо преимущество JOINing в FROM по сравнению с добавлением «table1.CurrentName = table2.id» в предложении WHERE?
Есть 3 предложения WHERE (с соединением). Я запустил EXPLAIN с различными комбинациями ордеров, и результаты оказались одинаковыми.
Я думал, что добавление индекса в table1.CurrentName может помочь, но теперь я думаю, что нет. Я изменил запрос, удалив ссылки на table2, но он по-прежнему работал медленно. (см. 3б)
Похоже, что основная часть замедления может быть вызвана просто чтением 800K записей при просмотре значений Type и Status. Имеет ли смысл индексировать эти два столбца, где есть только 3 или 4 возможных значения? Я думал, что это имеет смысл только тогда, когда есть больше уникальных значений.
объяснить результаты:
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
| 1 | SIMPLE | table1 | ALL | CurrentName | NULL | NULL | NULL | 733190 | Using where |
| 1 | SIMPLE | table2 | eq_ref | PRIMARY | PRIMARY | 4 | db.table1.CurrentName | 1 | |
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
2 rows in set (0.00 sec)