如何解决如何加快针对MyISAM表的庞大查询的速度?
| 该查询针对单个表。该表具有60个称为\“ attribute1 \”到\“ attribute60 \”的属性,它们都是类型:varchar(255)
还有一个名为\“ brand_id \”的列,即:
int(11)
表中存在以下密钥:
brand_id,attribute1,attribute2,attribute3
查询如下:
SELECT distinct attribute1
from brands b inner join product_applications pa on pa.brand_id = b.id
where b.id in (1,372,373,374,375,376,378,381,452,453,454,455,456,457,458,461,474,476,544,480,563,508,512,513,516,517,519,520,521,522,524,525,527,528,529,533,538,539,540,542,546,547,548,555,556,557,642,643,644,645,646,647,648,649,650,651,652,653,654,655)
这需要10秒钟以上。该表有5,735,673行。
此查询所需的时间不超过2秒。我无法弄清楚如何编写它,或者如果我需要某种替代表结构,则无法做到这一点。谁能提供推荐?
我曾经在WHERE子句中使用IN,但是在另一个论坛中建议使用这种丑陋的方法来加快连接速度。我真的不知道这意味着什么,但是它速度更快,但仍然非常慢。
+ ---- + ------------- + ------- + ------- + -------------- -------------------------- + -------------------- +- ------- + ----------- + ------- + ---------------------- --------------------- +
| id | select_type |桌子|类型可能的钥匙|关键key_len |参考|行|额外|
+ ---- + ------------- + ------- + ------- + -------------- -------------------------- + -------------------- +- ------- + ----------- + ------- + ---------------------- --------------------- +
| 1 |简单b |范围|主要|主要| 4 | NULL | 60 |在哪里使用使用索引;使用临时|
| 1 |简单pa |参考| brand_search_index,parttype_search_idx | brand_search_index | 5 | mcp5.b.id | 57356 |在哪里使用使用索引
+ ---- + ------------- + ------- + ------- + -------------- -------------------------- + -------------------- +- ------- + ----------- + ------- + ---------------------- --------------------- +
设置2行(0.04秒)
解决方法
这似乎是一个奇怪的查询,所以我可能会遗漏一些东西,但是我认为您可以使用IN子句来做到这一点:
SELECT distinct attribute1
from product_applications pa WHERE brand_id IN (1,372,...,655)
我认为这会更快-它肯定更干净-但是,如果没有,您可能需要添加一些有关索引的细节,也许是EXPLAIN QUERY等。
, 您的表是这样的:
brand...attr1......attr2..........attr3
BRAND...CATEGORY...PRODTYPE....PRODUCT
例如
DOVE....HOME.......SOAP.......dish washing liquid
您想要获取指定品牌列表的独特产品类别集。但是您有超过500万种产品,因此仅凭一张桌子就无法立即完成。通常处理此问题的方法是拥有多个相关表:
BRANDS(brandid,brandname)
CATEGORIES (categoryid,categoryname)
PRODTYPES (prodtypeid,prodtypename)
BRANDCATEGORIES (brandid,categoryid) EDIT: put a unique constraint on (brandid,categoryid)
PRODUCTS(brandid,categoryid,prodtypeid,productname)
然后,您的查询将是这样的:
select distinct categories.categoryid,categoryname
from brands inner join categories
on brand.brandid = brandcategories.brandid
and categories.categoryid = brandcategories.categoryid
where brands.brandid in ( .... )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。