Mysql 如何加快对MyISAM表的巨大查询?

Mysql 如何加快对MyISAM表的巨大查询?,mysql,database-design,Mysql,Database Design,此查询针对单个表。该表有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

此查询针对单个表。该表有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秒。该表有5735673行

此查询所需时间不超过2秒。我不知道如何编写它,或者是否需要某种替代表结构来完成这项工作。有人能推荐吗

我曾经在WHERE子句中使用IN,但在另一个论坛中,有人建议,由于加入,这种丑陋的方式会更快。我真的不知道这意味着什么,但它速度更快,但仍然非常慢

+----+-------------+-------+-------+----------------------------------------+--------------------+---------+-----------+-------+-------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+----------------------------------------+--------------------+---------+-----------+-------+-------------------------------------------+ | 1 | SIMPLE | b | range | PRIMARY | PRIMARY | 4 | NULL | 60 | Using where; Using index; Using temporary | | 1 | SIMPLE | pa | ref | brand_search_index,parttype_search_idx | brand_search_index | 5 | mcp5.b.id | 57356 | Using where; Using index | +----+-------------+-------+-------+----------------------------------------+--------------------+---------+-----------+-------+-------------------------------------------+ 2 rows in set (0.04 sec)
这似乎是一个奇怪的查询,因此我可能遗漏了一些内容,但我认为您可以使用IN子句来实现这一点:

SELECT distinct attribute1
from product_applications pa WHERE brand_id IN (1, 372, ..., 655)

我认为这会更快-当然更干净-但如果不是这样,您可能需要添加一些关于索引的详细信息,可能需要解释查询等。

您的表是这样的:

        brand...attr1......attr2..........attr3
        BRAND...CATEGORY...PRODTYPE....PRODUCT
e、 g

你想要得到一系列特定品牌的产品类别。但是你有超过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 ( .... )

也许是一个解释问题?永远不要离开家没有一个-这就是我最初拥有的,我在上面疯狂的方式更快。我用解释的结果更新了我的问题。InnoDB将如何加快查询速度?为什么那张桌子不正常?所有属性之间的差异导致了大量的行,但并不统一,因此可以按关系进行分解。联合查询中的ID列表是静态的吗?能否将这些值放入另一个仅包含id列的表中?如果没有其他功能,那么维护起来就更容易了。@AKWF:我问这个问题是为了证明DISTINCT必须做一些类似于全表扫描的事情来缩减结果集。它无法访问索引,因为attribute1位于多部分键的第二个位置。您确定这些字段需要varchar255吗?从产品应用程序分析中选择*的结果是什么?为什么该表不合理1个表中的60列不是最佳情况。
      select distinct categories.categoryid, categoryname
      from brands inner join categories
      on brand.brandid = brandcategories.brandid
      and categories.categoryid = brandcategories.categoryid
      where brands.brandid in ( .... )