1 таблица с именами автомобилей, а 2ая с именами марок авто table1 таблица - у неё есть следующие поля:
Чтобы было яснее, это будет таблица с мобильными телефонами.
table1: l_id - идентификатор автомобиля, он уникален l_name - наименование авто («ВАЗ 2101»,«AUDI R8») a_id - id марки автомобиля, cвязь с 2ой таблицей --------------------------------------------------------------------- table2: a_id - уникальный id марки авто g_id - id страны производителя авто (от 1 до 100)
Очень сложная структура таблиц, поэтому прошу помощи.
Делаем сложный запрос:
SELECT SQL_NO_CACHE #для чистоты эксперемента * FROM table1 as al, table2 as a WHERE a.a_id=al.a_id AND g_id IN (1) limit 1000 , 30;
Получается мы фильтруем всех производителей кроме страны с id 1, запрос выполняется 0.0003 сек.
Попробуем вывести 20 стран: g_id IN (1,2,3,4,5,6,7,8,9,20,30,40,50,60,70,80,90,99,55,77). Всё отлично, всё так же быстро.
Делаем сортировку по имени авто: ORDER BY l_name ASC - и вместо 0.0003 сек получаем 2 секунды. По-моему долго!
Explain подсказал, что l_name переберается и не использует индекс! Нам поможет FORCE INDEX (l_name). О чудо! 0.0400 сек! По-моему для связывания таблиц, установки WHERE и сортировки - 0.0400 сек это быстро.
Казалось бы выход найден. Используем индексы. Вернемся к запросу в котором мы фильтровали все страны кроме одной g_id in (1). Если опять это выполнить с использованием уже ускоряющего нас FORCE INDEX (l_name) - время выполнения будет 1 сек. КАК ТАК?? Кажется нелогичным, уменьшить объем выбираемой и сортируемой информации и при этом возрастает время обработки в 20 раз. Профилирование запроса покажет, что 99.5% времени процесс в статусе sending data. Добавляя в условие g_id новые страны дополнительного фильтрования - время sending data снижается по мере добавления идентификаторов стран в условие. Если не использовать FORCE INDEX (l_name), то скорость выполнения с условием g_id in (1) быстрая.
Неужели мне придется использовать FORCE INDEX (l_name) в зависимости от разности количества записей условия? :)
Буду рад любым пинкам в правильном направлении.