Mysql SQL查询处于统计状态

Mysql SQL查询处于统计状态,mysql,sql,database,optimization,Mysql,Sql,Database,Optimization,今天我一直在对这个复杂的查询进行故障排除,认为这是一个性能问题。查询似乎陷入了“统计”状态。它当前处于该状态达1300秒 我已经检查了相关表的索引——我已经优化了表——是什么导致了这种挂起 SELECT Import_Values.id, Import_Values.part_id, Import_Values.qty, Import_Values.note, Parts.partterminologyname, GROUP_CONCAT(Base

今天我一直在对这个复杂的查询进行故障排除,认为这是一个性能问题。查询似乎陷入了“统计”状态。它当前处于该状态达1300秒

我已经检查了相关表的索引——我已经优化了表——是什么导致了这种挂起

SELECT
    Import_Values.id,
    Import_Values.part_id,
    Import_Values.qty,
    Import_Values.note,
    Parts.partterminologyname,
    GROUP_CONCAT(BaseVehicle.YearID, ' ', Make.MakeName, ' ', Model.modelname, ' ', SubModel.SubModelName SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineDesignation.EngineDesignationName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineVIN.EngineVINName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.Liter) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.CC) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.CID) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.Cylinders) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.BlockType) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngBoreIn) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngBoreMetric) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngStrokeIn) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngStrokeMetric) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelDeliveryType.FuelDeliveryTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelDeliverySubType.FuelDeliverySubTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelSystemControlType.FuelSystemControlTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelSystemDesign.FuelSystemDesignName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Aspiration.AspirationName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(CylinderHeadType.CylinderHeadTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelType.FuelTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(IgnitionSystemType.IgnitionSystemTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Mfr.MfrName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineVersion.EngineVersion) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Valves.ValvesPerEngine) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(BedLength.BedLength) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(BedLength.BedLengthMetric) SEPARATOR ', ')
    FROM 
    Import_Values
    INNER JOIN BaseVehicle 
        ON Import_Values.base_vehicle_id=BaseVehicle.BaseVehicleID
    INNER JOIN Parts 
        ON Import_Values.part_type_id=Parts.PartTerminologyID
    INNER JOIN Make
        ON BaseVehicle.MakeID=Make.MakeID
    INNER JOIN Model
        ON BaseVehicle.ModelID=Model.ModelID
    INNER JOIN Vehicle
        ON Import_Values.base_vehicle_id=Vehicle.BaseVehicleID
    INNER JOIN SubModel
        ON Vehicle.SubModelID=SubModel.SubModelID
    INNER JOIN VehicleToEngineConfig
        ON Vehicle.VehicleID=VehicleToEngineConfig.VehicleID
    INNER JOIN EngineConfig
        ON VehicleToEngineConfig.EngineConfigID=EngineConfig.EngineConfigID
    INNER JOIN EngineDesignation
        ON EngineConfig.EngineDesignationID=EngineDesignation.EngineDesignationID
    INNER JOIN EngineVIN
        ON EngineConfig.EngineVINID=EngineVIN.EngineVINID
    INNER JOIN EngineBase
        ON EngineConfig.EngineBaseID=EngineBase.EngineBaseID
    INNER JOIN FuelDeliveryConfig
        ON EngineConfig.FuelDeliveryConfigID=FuelDeliveryConfig.FuelDeliveryConfigID
    INNER JOIN FuelDeliveryType
        ON FuelDeliveryConfig.FuelDeliveryTypeID=FuelDeliveryType.FuelDeliveryTypeID
    INNER JOIN FuelDeliverySubType
        ON FuelDeliveryConfig.FuelDeliverySubTypeID=FuelDeliverySubType.FuelDeliverySubTypeID
    INNER JOIN FuelSystemControlType
        ON FuelDeliveryConfig.FuelSystemControlTypeID=FuelSystemControlType.FuelSystemControlTypeID
    INNER JOIN FuelSystemDesign
        ON FuelDeliveryConfig.FuelSystemDesignID=FuelSystemDesign.FuelSystemDesignID
    INNER JOIN Aspiration
        ON EngineConfig.AspirationID=Aspiration.AspirationID
    INNER JOIN CylinderHeadType
        ON EngineConfig.CylinderHeadTypeID=CylinderHeadType.CylinderHeadTypeID
    INNER JOIN FuelType
        ON EngineConfig.FuelTypeID=FuelType.FuelTypeID
    INNER JOIN IgnitionSystemType
        ON EngineConfig.IgnitionSystemTypeID=IgnitionSystemType.IgnitionSystemTypeID
    INNER JOIN Mfr
        ON EngineConfig.EngineMfrID=Mfr.MfrID
    INNER JOIN EngineVersion
        ON EngineConfig.EngineVersionID=EngineVersion.EngineVersionID
    INNER JOIN Valves
        ON EngineConfig.ValvesID=Valves.Valvesid
    INNER JOIN VehicleToBedConfig
        ON Vehicle.VehicleID=VehicleToBedConfig.VehicleID
    INNER JOIN BedConfig
        ON VehicleToBedConfig.BedConfigID=BedConfig.BedConfigID
    INNER JOIN BedLength
        ON BedConfig.BedLengthID=BedLength.BedLengthID
    GROUP BY part_id

我最近也遇到了同样的问题:MySQL开始阻塞(陷入状态“统计”)许多表连接在一起的查询。我发现了一个很好的解释为什么会发生这种情况以及如何解决它

基本上,至少在MySQL 5.5中,配置参数optimizer\u search\u depth的默认值是62,这将导致查询优化器随着查询中表的数量增加而花费的时间呈指数级增加。在某个时间点之后,完成查询将开始需要几天甚至更长的时间

但是,如果在my.cnf中将优化器搜索深度设置为0,MySQL会自动选择合适的深度,但将其限制为7,这还不太复杂


显然这个问题已经出现在MySQL 5.6中,但我还没有亲自测试过

我在Centos服务器4核和180GB ram上也遇到了同样的问题。一个简单的查询需要花费很长时间才能运行,并且停留在统计状态,正如您所解释的。我在它查询的表上运行了
优化表
,大约5分钟后问题就解决了。然而,我从未发现它是否真的解决了这个问题

只是一个建议


我昨天花了一天时间处理一个类似的棘手问题

快速消除查询优化器挂起的另一个选项是在
SELECT
之后添加
stright\u JOIN

例如:

SELECT STRAIGHT_JOIN
table1.column_a,
table1.column_b,
table2.column_a,
table2.column_b
FROM table1
JOIN table2 USING(column_a)

这不是一个理想的解决方案,因为它完全绕过了连接的查询优化,但如果您像昨天一样在遗留应用程序中解决任务关键型问题,它可能会有所帮助。我不建议在每个查询中都使用此选项,但在某些情况下这是一个有效的解决方案。

Q:您是否运行了
EXPLAIN
以获取执行计划的详细信息?如果其中任何一个是MyISAM表,我建议使用
检查表x如果报告任何问题,则
修理表x
(但要小心:这可能会导致数据丢失。建议在修复前对表进行冷备份,并对表进行mysqldump)并使用
分析表x收集统计信息。我一直在这么做,是的。我认为这是一个查询问题,所以我添加了JOIN by JOIN以查看问题所在。现在我正在尝试对这个查询运行EXPLAIN SELECT,它的统计时间是100秒(到目前为止)。听起来MySQL可能正在启动以收集表和索引的统计数据。嘿,Spencer。有没有办法加快速度?我会确保统计数据是最新的。如果不是,则分析表x。这个查询有很多表,因此需要考虑很多连接路径。尝试获取一个要运行的表较少的查询。谢谢!我可以说我正在使用v5.7,我也遇到过同样的问题,所以我想它还没有解决。MariaDB 10.0.31(Ubunti 16.04)也存在同样的问题,
optimizer\u search\u depth=0
修复了它。非常感谢。该问题在最近的MariaDB(10.3.12)中也存在。我的多日查询现在运行在40毫秒。真棒!我们在运行v5.6.49时遇到了同样的问题,但幸运的是,在设置优化器_search_depth=7之后,问题就消失了。