我正在尝试优化我的网站,并希望得到一些帮助。
该网站是手机比较网站,查询是显示特定手机的优惠。数据在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秒加上。
提前致谢
答案 0 :(得分:1)
不能说我是所有那些双ID(数字和人类可读)的粉丝。如果您实际上不需要varchar版本,请删除它们。
将外键cmp_deals.tarrif_id
更改为引用cmp_tarrifs.ID
(即使其为INT
,如果使用InnoDB
,则实际创建外键约束。
至少将cmp_tariffs.ID
作为主键,并选择cmp_tariffs.tariff_id
作为唯一索引。
关税表上的零索引意味着它必须进行表扫描以完成连接。