Гриша К.
Новичок
При укзании в запросе значений для функции IN() больше 4, индексы не используются.
Здравствуйте.
Например, таблица содержит 9 записей, для которых category_id имеет значения 13, 23, 59, 137 (т.е., если GROUP BY category_id, то кол-во строк 4)
В данном случа получается, что MYSQL просматривает все записи в таблице, индексы не используются.
Если в условие запроса (WHERE) указать количество значений для функции IN (0,56,59,137),
соответвующее общему кол-ву значений category_id в таблице (13, 23, 59, 137 - 4 разных значения),
то EXPLAIN будет как предыдущий, только rows = 7, а если LIMIT 0,15, то индексы не будут использоваться (type = ALL).
Пробовал указывать
USE INDEX(PRIMARY,category_id), USE INDEX(category_id) - type = ALL,
FORCE INDEX(category_id) - type = range, key = category_id, но записи просматриваются веравно все (9)
Подскажиет пожалуйста как правильно оптимизировать запрос? Есть ли услвовие "product_id > 0", оптимальным и верным решением?
И мне непонятно почему при описанных выше условиях, такая разница в описании запроса EXPLAIN
Здравствуйте.
PHP:
# Есть следующая таблица:
CREATE TABLE products (
product_id int(10) unsigned NOT NULL auto_increment,
category_id int(10) unsigned NOT NULL,
product_name char(255) NOT NULL,
product_description text NOT NULL,
PRIMARY KEY (product_id), #Длина 9
KEY category_id (category_id), #Длина 9
) ENGINE=InnoDB;
PHP:
# Есть запрос к БД:
SELECT
* # Перечень нужных столбцов
FROM
products
WHERE
category_id IN(0,56,59,137,138,140)
LIMIT 0, 5
PHP:
# При описаниии запроса (EXPLAIN) результат такой:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 SIMPLE products ALL category_id NULL NULL NULL 9 Using where
PHP:
# Если в условие запроса (WHERE) добавить "product_id > 0",
# в результате EXPLAIN такой (даже если LIMIT 0,15 и в результате кол-во извлекаемых записей 7):
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 SIMPLE products range PRIMARY, category_id PRIMARY 4 NULL 4 Using where
соответвующее общему кол-ву значений category_id в таблице (13, 23, 59, 137 - 4 разных значения),
то EXPLAIN будет как предыдущий, только rows = 7, а если LIMIT 0,15, то индексы не будут использоваться (type = ALL).
Пробовал указывать
USE INDEX(PRIMARY,category_id), USE INDEX(category_id) - type = ALL,
FORCE INDEX(category_id) - type = range, key = category_id, но записи просматриваются веравно все (9)
Подскажиет пожалуйста как правильно оптимизировать запрос? Есть ли услвовие "product_id > 0", оптимальным и верным решением?
И мне непонятно почему при описанных выше условиях, такая разница в описании запроса EXPLAIN