mySql加入优化查询

时间:2011-08-08 23:04:39

标签: mysql left-join

我正在尝试优化我的网站,并希望得到一些帮助。

该网站是手机比较网站,查询是显示特定手机的优惠。数据在2个表上,cmp_deals表有931000个条目,cmp_tariffs表有2600个条目。常用字段是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)

没有索引

初始查询是

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 个答案:

答案 0 :(得分:1)

不能说我是所有那些双ID(数字和人类可读)的粉丝。如果您实际上不需要varchar版本,请删除它们。

将外键cmp_deals.tarrif_id更改为引用cmp_tarrifs.ID(即使其为INT,如果使用InnoDB,则实际创建外键约束。

至少将cmp_tariffs.ID作为主键,并选择cmp_tariffs.tariff_id作为唯一索引。

关税表上的零索引意味着它必须进行表扫描以完成连接。