MYSQL-如何解决未使用索引的慢查询,如何加快响应时间?

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

我已经阅读了其他几篇文章和页面,但我想不出一种加快和使用索引而不是全表扫描的方法

  1. 有疑问的查询
    select f.*,ci.item_name 
    from forecastpro.current_item_forecast f 
        left join cat_items as ci on f.item_number=ci.item_number
  1. 表结构

    CREATE TABLE `current_item_forecast` (
       `Axe3` varchar(128) DEFAULT NULL,
       `Axe5` varchar(128) DEFAULT NULL,
       `Axe7` varchar(128) DEFAULT NULL,
       `Axe11` varchar(128) DEFAULT NULL,
       `Item_Number` varchar(40) NOT NULL,
       `Item_Name` varchar(128) DEFAULT NULL,
       `fc_year` int(4) NOT NULL,
       `fc_period` int(2) NOT NULL,
       `Qty_Forecast` double NOT NULL DEFAULT '0',
       `USD_Forecast` double NOT NULL DEFAULT '0',
       `Stock_Start` float NOT NULL DEFAULT '0',
       `Stock_Transit` float NOT NULL DEFAULT '0',
       PRIMARY KEY (`Item_Number`,`fc_year` DESC,`fc_period`),
       KEY `Item` (`Item_Number`),
       KEY `Axe3` (`Axe3`),
       KEY `Axe5` (`Axe5`),
       KEY `Axe7` (`Axe7`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    
      CREATE TABLE `cat_items` (
       `Item_Number` char(32) NOT NULL,
       `Item_Name` char(128) DEFAULT NULL,
       `Axe3` char(10) DEFAULT NULL,
       `Item_Group` varchar(32) DEFAULT NULL,
       `Axe5` char(10) DEFAULT NULL,
       `Axe7` char(10) DEFAULT NULL,
       `Axe11` char(10) DEFAULT NULL,
       `Date_Created` datetime DEFAULT NULL,
       PRIMARY KEY (`Item_Number`),
       KEY `Item` (`Item_Number`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
  2. 解释

    id  select_type table   type    possible_keys   key key_len ref rows    Extra
    1   SIMPLE  f       ALL                 121882  100.00  
    1   SIMPLE  ci      ALL                 36838   100.00  Using where; Using join buffer (Block Nested Loop)
    
  3. 其他尝试

    **This two produce the same result:**
    
    update forecastpro.current_item_forecast f
        left join cupfsa.cat_items ci on f.item_number=ci.item_number
    set f.item_name=ci.item_name
    
    update forecastpro.current_item_forecast f
        left join cupfsa.cat_items ci FORCE KEY FOR JOIN (PRIMARY) on f.item_number=ci.item_number
    set f.item_name=ci.item_name
    
    id  select_type table   type    possible_keys   key key_len ref rows    Extra
    1   UPDATE  f       ALL                 76953   100.00  
    1   SIMPLE  ci      ALL                 36838   100.00  Using where
    

任何尝试运行都会永远运行。

你会推荐什么?

mysql performance query-performance
2个回答
2
投票

对于您的第一次选择查询,您可以尝试将以下索引添加到cat_items表中:

CREATE INDEX idx ON cat_items (item_number, item_name);

这在理想情况下应加快左联接过程,因为current_item_forecast表中的每个记录都将使用cat_items作为查找与item_number表匹配。请注意,我们还在索引中包含item_name,以便覆盖SELECT子句。


0
投票

(感谢您提供CREATE TABLEs;如果没有它们,很难找出问题的根本原因。)

请不要混合CHARACTER SETs,至少在使用varchars时不混合JOINing。这会导致代价高昂的表扫描。

current_item_forecast:
    `Item_Number` varchar(40) NOT NULL ... DEFAULT CHARSET=utf8mb4
cat_items:
   `Item_Number` char(32) ... DEFAULT CHARSET=utf8

长度一致(40对32)。>>

因为PRIMARY KEY是唯一键,所以不要在同一列中多余地包含KEY

PRIMARY KEY (`Item_Number`),
KEY `Item` (`Item_Number`)

除非列是真正固定的宽度,否则请使用VARCHAR。>>

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