2013-03-12 3 views
1

Я просматриваю свои медленные запросы и делаю все возможное, чтобы оптимизировать их. Я столкнулся с этим, что я застрял.Оптимизация с учетом mySql Query

EXPLAIN SELECT pID FROM ds_products WHERE pLevel >0 

id select_type table  type possible_keys key  key_len ref rows Extra 
1 SIMPLE  ds_products ALL pLevel   NULL NULL  NULL 45939 Using where 

Я индексировали pLevel [tinyint(1)], но запрос не использует его и делает полное сканирование таблицы.

Здесь количество строк этой таблицы для каждого значения плевел:

pLevel count 
0  34040 
1  3078 
2  7143 
3  865 
4  478 
5  279 
6  56 

если сделать запрос для определенного значения плевел, он использует индекс:

EXPLAIN SELECT pID FROM ds_products WHERE pLevel =6 

id select_type table  type possible_keys key    key_len ref  rows Extra 
1 SIMPLE  ds_products ref pLevel pLevel 1  const 1265 

Я пробовал pLevel> = 1 и pLevel < = 6 ... но он все еще выполняет полное сканирование

Я пробовал (pLevel = 1 или pLevel = 2 или pLevel = 3 или pLevel = 4 или pLevel = 5 или pLevel = 6) .... но он по-прежнему выполняет полное сканирование таблицы.

+0

Можете ли вы показать нам свой 'CREATE TABLE' SQL? – Kamil

+0

Какие другие значения (и их значения) для pLevel находятся вне диапазона 0-6? – Bohemian

+0

Никаких других значений, просто: 0,1,2,3,4,5,6 –

ответ

0

Попробуйте использовать MySQL GROUP BY.

SELECT pLevel, COUNT(*) 
FROM ds_products 
GROUP BY pLevel 

Edit:

Эта документация статья MySQL может быть полезной для вас. How to Avoid Table Scans

+0

Это то, что я использовал для подсчета строк из каждого значения для pLevel. То, что я пытаюсь оптимизировать, - это запрос выбора: «SELECT pID FROM ds_products WHERE pLevel> 0» –

+0

@Shaw Mead - Ой. Извини за это. См. Мое редактирование для объяснения возможной причины, по которой ваш ключ не используется. – Aiias

Смежные вопросы