Читаю
эту статью. Там в 7 пункте написано как выбирать индексы например для такого запроса:
SELECT * FROM users WHERE age = 29 AND gender = 'male'
Там написано что нужно выбирать порядок колонок в индексе сначала age, потом gender
CREATE INDEX age_gender ON users(age,gender);
Потому что любое значение колонки age обычно содержит около 200 записей.
А любое значение колонки gender — около 6000 записей.
mysql> select age, count(*) from users group by age;
+------+----------+
| age | count(*) |
+------+----------+
| 15 | 160 |
| 16 | 250 |
| ... |
| 76 | 210 |
| 85 | 230 |
+------+----------+
68 rows in set (0.00 sec)
mysql> select gender, count(*) from users group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| female | 8740 |
| male | 4500 |
+--------+----------+
2 rows in set (0.00 sec)
Выше в статье было написано что индексы это колонки где значения упорядочены, и потом когда СУБД использует индекс она
бинарным поиском находит нужные первичные ключи в этих упорядоченных колонках.
Так вот, почему сначала в индексе надо сначала указывать age, если можно указать сначала gender и отсечь за одну операцию ~6000 строк (это примерно пол таблицы) и потом в этой половине искать уже по age что будет уже в 2 раза быстрее чем если строить индекс age_gender.
Сори что так много написал, не получилось кратко.