2013-08-10 2 views
0

У меня есть таблица (продукт) с 5.4 миллионами исправлений. Если я использую ниже запрос, чтобы получить результат, но он работает очень медленно. Существует ли более эффективный подход?Как быстро найти записи в большой таблице?

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
     sd.pname, sd.pcaption, sd.ptype 
FROM (SELECT imageid 
     FROM product 
     WHERE productkeyword IN (SELECT primary_kwd 
            FROM searchkwdmgmt 
            WHERE allkwd IN ('IPhone')) 
     GROUP BY imageid 
     HAVING Count(*) = 1 
     LIMIT 0, 31) q 
     JOIN searchdetails sd 
     ON sd.imageid = q.imageid 
+0

Можете ли вы перечислить индексы в таблицах в своем запросе? –

+0

** Вам нужно показать нам определения таблиц и индексов **, а также подсчет строк для каждой из таблиц. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали. Не видя определения таблиц и индексов, мы не можем сказать. Нам также нужны подсчет строк, потому что это может сильно повлиять на оптимизацию запросов. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. –

+0

Можете ли вы показать нам EXPLAIN обоих запросов select? –

ответ

1

Создание индексов на столбцах ниже

1.Column: allkwd Таблица: searchkwdmgmt

2.Column: ImageID таблице: searchdetails

3.Column: ImageID Таблица: продукт

4. Избегайте использования в пункте

+0

Как я могу найти несколько ключевых слов в таблице продуктов без использования в разделе. –

+1

use Join Вместо того, чтобы в пункте – Algorithmist

1

Эта часть плохо из-за подзапроса

SELECT imageid 
FROM product 
WHERE productkeyword IN (SELECT primary_kwd 
         FROM searchkwdmgmt 
         WHERE allkwd IN ('IPhone')) 

тот же запрос должен возвращать одни и те же данные, но более эффективным, если индексы правильно установлены.

SELECT 
    p.imageid 
FROM 
    product as p 
INNER JOIN 
    searchkwdmgmt as s ON p.productkeyword = s.primary_kwd 
WHERE 
    s.allkwd IN ('IPhone') 

Test это первое перед вами заменить его ...

1

Старые версии MySQL делают плохую работу, оптимизируя in с подзапроса. Если вы знаете, что существует не более одного матча ключевого слова в searchkwdmgmt для каждой записи в product вы можете сделать:

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
     sd.pname, sd.pcaption, sd.ptype 
FROM (SELECT p.imageid 
     FROM product p join 
      searchkwdmgmt s 
      on p.productkeyword = s.primary_kwd and 
       s.allkwd in ('IPhone') 
     GROUP BY p.imageid 
     HAVING Count(*) = 1 
     LIMIT 0, 31 
     ) q join 
     searchdetails sd 
     ON sd.imageid = q.imageid ; 

Если может быть больше, чем один матч ключевого слова и есть в product таблицы id, вы можете делать:

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
     sd.pname, sd.pcaption, sd.ptype 
FROM (SELECT p.imageid 
     FROM product p join 
      searchkwdmgmt s 
      on p.productkeyword = s.primary_kwd and 
       s.allkwd in ('IPhone') 
     GROUP BY p.imageid 
     HAVING Count(distinct p.productid) = 1 
     LIMIT 0, 31 
     ) q join 
     searchdetails sd 
     ON sd.imageid = q.imageid ; 

EDIT:

Все эти версии будут быстрее со следующими показателями: searchkwdmgmt(primary_kwd, allkwd), product(productkeyword, imageid) и searchdetails(imageid).

+0

показывается результатов 22 секунд в mysql. –

+0

Показаны результаты в 22 сек .. –

+0

@RohitKhurana. , , Хорошо это или плохо? Сколько времени занимает исходный запрос? И какую версию MySQL вы используете? –

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