开发者

mySql Join optimisation query

开发者 https://www.devze.com 2023-03-26 15:01 出处:网络
I am trying to optimise my site and would be grateful for some help. The site is a mobile phone comparison site and the query is to show the offers for开发者_高级运维 a particular phone. The data is

I am trying to optimise my site and would be grateful for some help.

The site is a mobile phone comparison site and the query is to show the offers for开发者_高级运维 a particular phone. The data is on 2 tables, the cmp_deals table has 931000 entries and the cmp_tariffs table has 2600 entries. The common field is the tariff_id.

###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)

No Indexes

The initial query is

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

and then the results can be sorted by various items in the cmp_deals table such as cash_back or free_gift

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

This is the result when I run an "EXPLAIN" command, but I don't really understand the results.

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

I would like to know please if I am doing these queries in the most efficient way as the queries are averaging at 2 seconds plus.

Thanks in advance


Can't say I'm a fan of all those double IDs (numeric and human-readable). If you don't actually need the varchar versions, drop them.

Change the foreign key cmp_deals.tarrif_id to reference cmp_tarrifs.ID (ie, make it an INT and if using InnoDB, actually create foreign key constraints).

At the very least make cmp_tariffs.ID a primary key and optionally cmp_tariffs.tariff_id a unique index.

Having zero indexes on the tariffs table means it has to do a table scan to complete the join.

0

精彩评论

暂无评论...
验证码 换一张
取 消