代码之家  ›  专栏  ›  技术社区  ›  Влад Чачиев

MySQL多个发送数据状态

  •  1
  • Влад Чачиев  · 技术社区  · 7 年前

    我的查询太长了。当我分析它时,我会看到这样的情况:

        Sending data    0.039324
        executing   0.000011
        Sending data    0.039662
        executing   0.000012
        Sending data    0.040380
        executing   0.000015
        Sending data    0.035879
        executing   0.000012
        Sending data    0.035426
        executing   0.000012
        Sending data    0.038107
        executing   0.000011
        Sending data    0.035247
        executing   0.000011
        Sending data    0.050108
        executing   0.000014
        Sending data    0.045458
        executing   0.000012
        Sending data    0.034700
        executing   0.000012
        Sending data    0.036205
        executing   0.000012
        Sending data    0.034602
        executing   0.000015
        Sending data    0.034580
        executing   0.000012
        Sending data    0.034477
        executing   0.000010
        Sending data    0.034382
        executing   0.000010
        Sending data    0.034416
        executing   0.000011
        Sending data    0.034335
        executing   0.000010
        Sending data    0.034474
        executing   0.000010
        Sending data    0.034405
        executing   0.000010
        Sending data    0.034433
        executing   0.000011
        Sending data    0.034544
        executing   0.000010
        Sending data    0.034525
        executing   0.000011
        Sending data    0.034459
        executing   0.000010
        Sending data    0.034766
        executing   0.000011
        Sending data    0.034633
        executing   0.000010
        Sending data    0.034574
        executing   0.000011
        Sending data    0.034607
        executing   0.000010
        Sending data    0.034613
        executing   0.000011
        Sending data    0.034394
        executing   0.000010
        Sending data    0.034606
        executing   0.000011
        Sending data    0.034790
        executing   0.000011
        Sending data    0.034614
        executing   0.000011
        Sending data    0.034497
        executing   0.000010
        Sending data    0.034756
        executing   0.000010
        Sending data    0.034440
        executing   0.000010
        Sending data    0.034414
        executing   0.000011
        Sending data    0.034484
        executing   0.000011
        Sending data    0.034490
        executing   0.000011
        Sending data    0.034672
        executing   0.000011
        Sending data    0.034455
        executing   0.000011
        Sending data    0.034430
        executing   0.000011
        Sending data    0.034509
        executing   0.000012
        Sending data    0.034432
        executing   0.000012
        Sending data    0.034348
        executing   0.000011
        Sending data    0.034378
        executing   0.000011
        Sending data    0.034356
        executing   0.000011
        Sending data    0.034631
        end 0.000014
        query end   0.000007
        closing tables  0.000010
        freeing items   0.000025
        logging slow query  0.000003
        logging slow query  0.000004
        cleaning up 0.000004
    

    发送数据太多了。

    我运行的查询:

    SELECT COUNT(*) as count from OrdersArchive where ID>0 and PId IN ('2564') and 
       (
       ID like '17000106864' 
       OR `OrderID` like '17000106864' 
       OR `ID` IN
       (
           SELECT `transferID`
           FROM `custom_fields`
           WHERE `fieldName` = 'invoiceNumber'
           AND `value` like '%17000106864%'
       )
       OR `tpb` LIKE '17000106864' 
    
       )
    

    解释节目

    id  select_type table   type    possible_keys   key key_len ref rows    Extra
    1   PRIMARY OrdersArchive   range   PRIMARY,ID_UNIQUE   PRIMARY 4   NULL    41609   Using where
    2   DEPENDENT SUBQUERY  custom_fields   ALL NULL    NULL    NULL    NULL    93141   Using where
    
    

    CREATE TABLE IF NOT EXISTS `OrdersArchive` (
      `ID` int(11) NOT NULL,
      `ids` int(11) NOT NULL DEFAULT '0',
      `OrderID` varchar(11) NOT NULL DEFAULT '0',
      `PricePosition` int(11) NOT NULL DEFAULT '0',
      `Reverse` tinyint(1) DEFAULT NULL,
      `DataOrder` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `DataFlightTrain` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
      `Customer` varchar(255) DEFAULT NULL,
      `PhoneCustomer` varchar(255) DEFAULT NULL,
      `EmailCustomer` varchar(255) DEFAULT NULL,
      `Provider` int(11) DEFAULT NULL,
      `DeliveryTime` timestamp NULL DEFAULT NULL,
      `Address1` varchar(255) DEFAULT NULL,
      `Address2` varchar(255) NOT NULL,
      `Passangers` varchar(1024) DEFAULT NULL,
      `PassangersPhones` varchar(255) NOT NULL,
      `PassangersEmailes` varchar(255) NOT NULL,
      `FlightTrain` varchar(255) DEFAULT NULL,
      `QuantityPassangers` int(11) DEFAULT '1',
      `NamePlate` varchar(255) DEFAULT NULL,
      `PhoneDriver` varchar(255) DEFAULT NULL,
      `PhoneDriverNeed` tinyint(1) DEFAULT '0',
      `Status` int(11) DEFAULT NULL,
      `Operator` int(11) DEFAULT NULL,
      `userId` int(11) NOT NULL,
      `usn` varchar(256) NOT NULL,
      `ArendaNeed` varchar(255) DEFAULT '',
      `ArendaHour` int(11) DEFAULT NULL,
      `ArendaMinutes` varchar(255) DEFAULT '',
      `Cost` double DEFAULT NULL,
      `Notes` text NOT NULL,
      `notes2` varchar(256) NOT NULL DEFAULT '',
      `PId` int(11) NOT NULL DEFAULT '0',
      `Voucher` varchar(256) NOT NULL,
      `Invoice` varchar(256) NOT NULL,
      `Meet` varchar(255) NOT NULL,
      `Toward` varchar(255) NOT NULL,
      `techStatus` int(2) NOT NULL DEFAULT '0',
      `City` varchar(55) NOT NULL,
      `City2` varchar(55) NOT NULL,
      `Auto` varchar(30) NOT NULL,
      `department` varchar(255) NOT NULL DEFAULT '',
      `nsktime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
      `tpb` varchar(255) NOT NULL DEFAULT '',
      `ban_add_races` int(1) NOT NULL DEFAULT '0',
      `paid` int(10) NOT NULL DEFAULT '0',
      `taxi` varchar(255) NOT NULL DEFAULT '',
      `price_client` int(11) DEFAULT NULL,
      `comission_from_client` int(11) DEFAULT NULL,
      `primechanie` varchar(1000) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `ID_UNIQUE` (`ID`),
      KEY `fk_Orders_Users1_idx` (`Operator`),
      KEY `fk_Orders_Providers1_idx` (`Provider`),
      KEY `fk_Orders_OrderStatus1_idx` (`Status`),
      KEY `ids` (`ids`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    ## and other table
    
    CREATE TABLE IF NOT EXISTS `custom_fields` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `pid` int(11) NOT NULL,
      `transferID` int(11) NOT NULL,
      `fieldName` varchar(255) NOT NULL,
      `value` varchar(1024) NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=325452 ;
    
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   SpacemanSpiff    7 年前

    虽然当前的SELECT查询可能会在某种程度上得到改进,但我认为如果您能够以更高效的方式存储数据,尤其是如果您可以消除对

    value

    如果您为invoiceNumber创建一个单独的字段,并在插入数据时填充该字段,则可以对其进行索引,并按如下方式选择/连接:

    其中发票编号=17000106864

        2
  •  0
  •   Влад Чачиев    7 年前

    嗯,我是通过内部连接完成的。运行0.34秒

    最终查询是:

    SELECT COUNT(`OrdersArchive`.ID) as count, `OrdersArchive`.ID
    FROM `OrdersArchive`
    INNER JOIN `custom_fields` on `OrdersArchive`.ID = `custom_fields`.`transferID`
    WHERE `OrdersArchive`.ID>0 
    AND `custom_fields`.`fieldName` = 'invoiceNumber'
    AND 
    `OrdersArchive`.PId IN ('2564') AND
    (
       `OrdersArchive`.ID LIKE '17000106864' 
       OR `OrdersArchive`.`OrderID` LIKE '17000106864' 
       OR `OrdersArchive`.`tpb` LIKE '17000106864' 
       OR (
     `custom_fields`.`value` like '%17000106864%'
       )
    ) 
    
        3
  •  0
  •   Rick James    7 年前

    IN(SELECT ...) 通常效率很低。在您的例子中,它被重复执行,从而为每个调用“执行”和“发送数据”。

    其他答案通过将该构造转换为 JOIN

    其他问题;

    PRIMARY KEY (`ID`),   -- This is UNIQUE and an INDEX
    UNIQUE KEY `ID_UNIQUE` (`ID`),  -- totally redundant; DROP it
    

    由于模式是“EAV”(实体属性值),并且需要基于某个键值(“invoiceNumber”)进行过滤,因此您可能会受到性能问题的困扰。考虑将其从键值表中拉出( custom_fields )把它放在主桌上( OrdersArchive

    但我看到了 OrdersArchive公司 有相当多的列。但我没有任何具体的建议。

    自定义_字段 my tips