基本思想:
1)我有一个包含大量数据的Mysql Server:9个表全部或多或少地以线性方式链接到外键。
2)我想使用GUI提取一些结果:显示了这9个表,每个表只有一个变量。可以说:
现在通过在表->频率-> 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个更新表。
有什么方法可以加快这个过程或这个“选择不同的”查询吗?
顺便说一句:我真的没有能力理解解释。如果有很大的提示,我不会看到...
询问查询性能问题时,应显示表的结构和索引,以便于提供帮助。
您将8个表连接在一起,唯一的限制是产品名称必须为"GoodProduct"
。 product
表与chip
和product_name
联接在一起,因此您应该检查在这些name
/ product_name
列上是否有索引。根据ROI
和result
中的行数,您可能需要在它们上使用复合索引。
您的查询格式有点复杂并且难以阅读。您可以使用以下格式简化内容:
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")
注意,表lot
,ROI
,result
,setup
和dataset
仅在查询中是因为每个表上都需要有一行与"GoodProduct"
相匹配的行。如果这不是必需的,则可以仅使用product
,chip
和wafer
表进行查询,因此性能会好很多。
这些表中的大多数都不能证明查询内容。删除lot
,dataset
甚至更多。 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)