如何加快针对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 ( .... )
    

要回复问题请先登录注册