MySQL与subQuery不同

问题描述 投票:0回答:2

移至:MySQL Distinct performance

基本思想:

1)我有一个包含大量数据的Mysql Server:9个表全部或多或少地以线性方式链接到外键。

2)我想使用GUI提取一些结果:显示了这9个表,每个表只有一个变量。可以说:

  • 表1:频率:20,40,80,100
  • 表2:波长:300,400,500,600
  • 表3:....

现在通过在表->频率-> 20中进行标记,数据库应该检查每隔一个表,是否存在使用频率20进行测量的条目,并根据20来更新所有表。

但是:我只想在每个表中显示不同的值。而且这花了17秒,对于GUI等待来说非常可怜。

示例代码:

SELECT wafer.ID
FROM product
  JOIN chip ON chip.product_name=product.name
  JOIN wafer ON wafer.ID = chip.wafer_ID
  JOIN lot ON lot.ID = wafer.lot_ID
  JOIN ROI ON ROI.ID_string = chip.ROI_ID
  JOIN result ON result.chip_ID = chip.ID_string
  JOIN setup ON setup.ID_md5 = result.setup_ID 
  JOIN dataset ON dataset.ID_md5 = result.dataset_ID
WHERE product.name IN ("GoodProduct")

持续时间:0.34 s提取:17秒(1.5e6行)

说明:

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1   SIMPLE  product     const   PRIMARY,name_UNIQUE PRIMARY 137 const   1   100.00  Using index
1   SIMPLE  dataset     index   PRIMARY,ID_UNIQUE   ID_UNIQUE   137     501 100.00  Using index
1   SIMPLE  result      ref dataset-result_idx,chip_ID_idx,setupID  dataset-result_idx  137 databaseName.dataset.ID_md5 159 100.00  
1   SIMPLE  setup       eq_ref  PRIMARY PRIMARY 137 databaseName.result.setup_ID    1   100.00  Using index
1   SIMPLE  chip        eq_ref  PRIMARY,ID_UNIQUE,Chip_UNIQUE,product_name_idx,ROI_ID   PRIMARY 452 databaseName.result.chip_ID 1   49.99   Using where
1   SIMPLE  ROI     eq_ref  PRIMARY,ID_UNIQUE   PRIMARY 302 databaseName.chip.ROI_ID    1   100.00  Using index
1   SIMPLE  wafer       eq_ref  PRIMARY,waferID_UNIQUE,number   PRIMARY 62  databaseName.chip.wafer_ID  1   100.00  
1   SIMPLE  lot     eq_ref  PRIMARY,lotnumber_UNIQUE    PRIMARY 62  databaseName.wafer.lot_ID   1   100.00  Using index

SELECT distinct wafer.ID {...same code as before}

持续时间:23 s提取:0.000秒(54行)

说明:

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1   SIMPLE  product     const   PRIMARY,name_UNIQUE PRIMARY 137 const   1   100.00  Using index; Using temporary
1   SIMPLE  dataset     index   PRIMARY,ID_UNIQUE   ID_UNIQUE   137     501 100.00  Using index
1   SIMPLE  result      ref dataset-result_idx,chip_ID_idx,setupID  dataset-result_idx  137 databaseName.dataset.ID_md5 159 100.00  
1   SIMPLE  setup       eq_ref  PRIMARY PRIMARY 137 databaseName.result.setup_ID    1   100.00  Using index
1   SIMPLE  chip        eq_ref  PRIMARY,ID_UNIQUE,Chip_UNIQUE,product_name_idx,ROI_ID   PRIMARY 452 databaseName.result.chip_ID 1   49.99   Using where
1   SIMPLE  ROI     eq_ref  PRIMARY,ID_UNIQUE   PRIMARY 302 databaseName.chip.ROI_ID    1   100.00  Using index
1   SIMPLE  wafer       eq_ref  PRIMARY,waferID_UNIQUE,number   PRIMARY 62  databaseName.chip.wafer_ID  1   100.00  
1   SIMPLE  lot     eq_ref  PRIMARY,lotnumber_UNIQUE    PRIMARY 62  databaseName.wafer.lot_ID   1   100.00  Using index; Distinct

我真的很奇怪为什么这种独特的方法需要这么长时间。这里的所有行都有索引。本示例仅显示一个表的代码。但是我需要9个更新表。

有什么方法可以加快这个过程或这个“选择不同的”查询吗?

顺便说一句:我真的没有能力理解解释。如果有很大的提示,我不会看到...

database

mysql join optimization distinct explain
2个回答
1
投票

询问查询性能问题时,应显示表的结构和索引,以便于提供帮助。

您将8个表连接在一起,唯一的限制是产品名称必须为"GoodProduct"product表与chipproduct_name联接在一起,因此您应该检查在这些name / product_name列上是否有索引。根据ROIresult中的行数,您可能需要在它们上使用复合索引。

您的查询格式有点复杂并且难以阅读。您可以使用以下格式简化内容:

SELECT wafer.ID
FROM product
  JOIN chip ON chip.product_name=product.name
  JOIN wafer ON wafer.ID = chip.wafer_ID
  JOIN lot ON lot.ID = wafer.lot_ID
  JOIN ROI ON ROI.ID_string = chip.ROI_ID
  JOIN result ON result.chip_ID = chip.ID_string
  JOIN setup ON setup.ID_md5 = result.setup_ID 
  JOIN dataset ON dataset.ID_md5 = result.dataset_ID
WHERE product.name IN ("GoodProduct")

注意,表lotROIresultsetupdataset仅在查询中是因为每个表上都需要有一行与"GoodProduct"相匹配的行。如果这不是必需的,则可以仅使用productchipwafer表进行查询,因此性能会好很多。


0
投票

这些表中的大多数都不能证明查询内容。删除lotdataset甚至更多。 OTOH,他们可能提供的一件事是,例如,该物品是否有“一批”。也就是说,这不会给您想要的答案吗?SELECT DISTINCT wafer.ID FROM product JOIN chip ON chip.product_name = product.name JOIN wafer ON wafer.ID = chip.wafer_ID WHERE product.name IN ("GoodProduct")

如果您还没有这些索引,可能会有所帮助:

product: (name) result: (dataset_ID, setup_ID, chip_ID) dataset: (ID_md5) setup: (ID_md5) chip: (ID_string, ROI_ID, wafer_ID, product_name) ROI: (ID_string) wafer: (lot_ID, ID)

© www.soinside.com 2019 - 2024. All rights reserved.