mySql Join优化查询

发布于 2024-11-28 16:49:18 字数 1692 浏览 1 评论 0原文

我正在尝试优化我的网站,如果您能提供一些帮助,我将不胜感激。

该网站是一个手机比较网站,查询是为了显示特定手机的报价。数据位于 2 个表中,cmp_deals 表有 931000 个条目,cmp_tariffs 表有 2600 个条目。公共字段是关税_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 秒以上。

提前致谢

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧时光的容颜 2024-12-05 16:49:18

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

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

至少使 cmp_tariffs.ID 成为主键,并且可以选择使 cmp_tariffs.tariff_id 成为唯一索引。

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文