mySql Join запрос на оптимизацию - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь оптимизировать свой сайт и буду признателен за помощь.

Сайт представляет собой сайт сравнения мобильных телефонов, и запрос состоит в том, чтобы показать предложения для определенного телефона. Данные представлены в 2 таблицах, таблица cmp_deals содержит 931000 записей, а таблица cmp_tariffs - 2600 записей. Общее поле - Тариф_ид.

###The deals table###
id  int(11)
hs_id   varchar(30)
tariff_id   varchar(30)
hs_price    decimal(4,2)
months_free     int(2)
months_half     int(2)
cash_back   decimal(4,2)
free_gift   text
retailer_id     varchar(20)

###Deals Indexes###
hs_id   INDEX   430     Edit    Drop    hs_id
months_half     INDEX   33      Edit    Drop    months_half
months_free     INDEX   25      Edit    Drop    months_free
hs_price    INDEX   2223    Edit    Drop    hs_price
cash_back   INDEX<br/>


###The tariff table###
ID  int(11)
tariff_id   varchar(30)
tariff_name     varchar(255)
tariff_desc     text
anytime_mins    int(5)
offpeak_mins    int(5)
texts   int(5)
line_rental     decimal(4,2)
cost_offset     decimal(4,2)

Нет индексов

Исходный запрос

SELECT * FROM `cmp_deals`
LEFT JOIN `cmp_tariffs` USING (tariff_id)
WHERE hs_id = 'iphone432gbwhite'

и затем результаты могут быть отсортированы по различным элементам в таблице cmp_deals, таким как cash_back или free_gift

SELECT * FROM `cmp_deals`
LEFT JOIN `cmp_tariffs` USING (tariff_id)
WHERE hs_id = 'iphone432gbwhite'
ORDER BY hs_price DESC
LIMIT 30

Это результат, когда я запускаю команду "EXPLAIN", но я не совсем понимаю результаты.

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra<br/>
1   SIMPLE  cmp_deals   ref     hs_id   hs_id   92  const   179     Using where; Using temporary; Using filesort<br/>
1   SIMPLE  cmp_tariffs     ALL     NULL    NULL    NULL    NULL    2582

Я хотел бы знать, пожалуйста, выполняю ли я эти запросы наиболее эффективным способом, поскольку их усреднение составляет 2 секунды плюс.

Заранее спасибо

1 Ответ

1 голос
/ 09 августа 2011

Не могу сказать, что я фанат всех этих двойных идентификаторов (числовых и читаемых человеком). Если вам на самом деле не нужны версии varchar, отбросьте их.

Измените внешний ключ cmp_deals.tarrif_id на ссылку cmp_tarrifs.ID (т. Е. Сделайте его INT, а при использовании InnoDB создайте ограничения внешнего ключа).

Как минимум, сделать cmp_tariffs.ID первичным ключом и, необязательно, cmp_tariffs.tariff_id уникальным индексом.

Наличие нулевых индексов в таблице тарифов означает, что для завершения объединения необходимо выполнить сканирование таблицы.

...