Mysql加入查询优化

时间:2013-03-19 19:20:47

标签: mysql sql database performance optimization

您好我正在尝试使用此查询运行此select语句,并且运行时间超过2小时。我已将所有索引设置为正确。但它仍然需要永远是我缺少的东西或一种更有效的方式连接表,这将加快这个查询?

我为所有连接在一起的项目设置了索引,它们的长度和数据类型相同。

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    t.regular_discount     
FROM part p 
        LEFT JOIN tabjbmaw t ON t.accountnum        = '73050'
                            AND p.numeric_line_code = t.numeric_line_code 
                            AND p.sub_code          = t.sub_code    
        JOIN warehouse w ON w.sap_article_id = p.sap_article_id;

+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+
| id | select_type | table     | type | possible_keys                                    | key                   | key_len | ref                              | rows   | Extra       |
+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+
|  1 | SIMPLE      | part      | ALL  | PRIMARY,sap_article,part_sap_article_id_fk       | NULL                  | NULL    | NULL                             | 389309 |             |
|  1 | SIMPLE      | warehouse | ref  | article                                          | article               | 130     | inventory.part.sap_article_id    |      5 | Using where |
|  1 | SIMPLE      | tabjbmaw  | ref  | numeric_line_code_idx,subcode_idx,accountnum_idx | numeric_line_code_idx | 5       | inventory.part.numeric_line_code |     19 |             |
+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+

感谢您的帮助

+-----------------------------+--------------+------+-----+---------------------+-----------------------------+
| Field                       | Type         | Null | Key | Default             | Extra                       |
+-----------------------------+--------------+------+-----+---------------------+-----------------------------+
| sap_article_id              | varchar(24)  | NO   | PRI |                     |                             |
| sap_brand_id                | varchar(20)  | NO   |     | NULL                |                             |
| uag_partnum                 | varchar(20)  | NO   | MUL | NULL                |                             |
| uag_linecode                | varchar(5)   | NO   | MUL | NULL                |                             |
| cag_partnum                 | varchar(20)  | NO   | MUL | NULL                |                             |
| cag_linecode                | varchar(5)   | NO   |     | NULL                |                             |
| product_category_legacy     | varchar(20)  | NO   |     | NULL                |                             |
| part_description            | varchar(128) | NO   |     | NULL                |                             |
| abc_indicator               | varchar(8)   | NO   |     | NULL                |                             |
| pack_code                   | varchar(8)   | NO   |     | NULL                |                             |
| case_qty                    | int(11)      | NO   |     | NULL                |                             |
| per_car_qty                 | int(11)      | NO   |     | NULL                |                             |
| uom                         | varchar(6)   | NO   |     | NULL                |                             |
| upc_code                    | varchar(128) | NO   |     | NULL                |                             |
| jobber_price                | float(14,4)  | YES  |     | NULL                |                             |
| jobber_core                 | float(14,4)  | YES  |     | NULL                |                             |
| date_last_price_change      | timestamp    | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| weight                      | float(14,4)  | YES  |     | NULL                |                             |
| weight_unit                 | varchar(6)   | NO   |     | NULL                |                             |
| dimension_type              | varchar(6)   | NO   |     | NULL                |                             |
| length                      | float(14,4)  | YES  |     | NULL                |                             |
| width                       | float(14,4)  | YES  |     | NULL                |                             |
| height                      | float(14,4)  | YES  |     | NULL                |                             |
| updated                     | tinyint(1)   | NO   |     | 0                   |                             |
| superseded_sap_article_id   | varchar(24)  | YES  |     | NULL                |                             |
| last_updated                | timestamp    | NO   |     | 0000-00-00 00:00:00 |                             |
| hour_updated                | int(11)      | YES  |     | NULL                |                             |
| discount1                   | float        | YES  |     | NULL                |                             |
| discount2                   | float        | YES  |     | NULL                |                             |
| product_category            | varchar(3)   | YES  |     | NULL                |                             |
| superseded_part_number      | varchar(20)  | YES  |     | NULL                |                             |
| sub_code                    | varchar(3)   | YES  | MUL | NULL                |                             |
| date_effective_price_change | date         | YES  |     | NULL                |                             |
| numeric_line_code           | varchar(3)   | YES  | MUL | NULL                |                             |
| list                        | float        | YES  |     | NULL                |                             |
+-----------------------------+--------------+------+-----+---------------------+-----------------------------+

3 个答案:

答案 0 :(得分:1)

  

我为所有正在连接的项目设置了索引

是的,但我猜测每个索引只有一个字段的索引名称。

让我们看一下描述中的几个专栏。

| table     | possible_keys                                    | key                   
+-----------+--------------------------------------------------+----------------
| part      | PRIMARY,sap_article,part_sap_article_id_fk       | NULL                  
| warehouse | article                                          | article               
| tabjbmaw  | numeric_line_code_idx,subcode_idx,accountnum_idx | numeric_line_code_idx 

它可以使用numeric_line_code,subcode和accountnum的索引,但是只有三个索引,每个索引都有一个字段,没有索引包含所有字段。您正在使优化器选择一个字段索引之一,而不是提供一个可用于所有三个字段的索引。

在表tabjbmaw上添加一个索引,其中包含三个字段numeric_line_code,subcode和accountnum。

答案 1 :(得分:0)

扩展@Sebas答案,你应该首先选择tabjbmaw:

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    t.regular_discount     
FROM tabjbmaw t
        LEFT JOIN parts p ON p.numeric_line_code = t.numeric_line_code 
                             AND p.sub_code       = t.sub_code    
        JOIN warehouse w ON w.sap_article_id = p.sap_article_id
WHERE t.accountnum = '73050'
;

答案 2 :(得分:0)

您可以尝试将左连接作为子选择放入SELECT部分​​。这可能会让事情变得更快。

像这样:

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    (SELECT t.regular_discount FROM tabjbmaw t WHERE t.accountnum = '73050' AND p.numeric_line_code = t.numeric_line_code AND p.sub_code = t.sub_code LIMIT 1)    
FROM 
    part p 
    JOIN warehouse w ON w.sap_article_id = p.sap_article_id;