与通过Navicat生成的查询计划相比,PHP中的MySQL查询计划有所不同

时间:2018-09-28 05:11:57

标签: php mysql query-planner

发布此消息时,我很困惑。 我不明白为什么我在php中触发EXPLAIN与在navicat中为完全相同的查询触发EXPLAIN时查询的查询计划为何不同。

查询:

SELECT 
    MAX(`SaleID`) AS 'LatestSaleID',
    MAX(`SaleDate`) AS 'MyLastVisit',
    COUNT(SaleID) AS 'MyNumVisits'                          
FROM sales_table
WHERE sales_table.CustomerID = '5207'

说明Navicat的输出:

  • id-1
  • select_type-简单
  • 表格-sales_table
  • 分区-空
  • 类型-参考
  • possible_keys-客户ID
  • 键-客户ID
  • key_len-22
  • ref-const
  • 行-1
  • 已过滤-100
  • 额外-NULL

说明从PHP触发时的输出:

  • id-1
  • select_type-简单
  • 表格-sales_table
  • 分区-NULL
  • 类型-全部
  • possible_keys-客户ID
  • 键-NULL
  • key_len-NULL
  • 引用-NULL
  • 行-1772719
  • 已过滤-10.00
  • 其他-使用何处

如您所见,解释输出有很大的不同。由于存在这种差异,因此从我的PHP页面执行查询的时间要长4倍。

我尝试使用强制索引。但是,那也不起作用。

SELECT 
    MAX(`SaleID`) AS 'LatestSaleID',
    MAX(`SaleDate`) AS 'MyLastVisit',
    COUNT(SaleID) AS 'MyNumVisits'                          
FROM sales_table USE INDEX(CustomerID)
WHERE sales_table.CustomerID = '5207'

我找到了一条相关的帖子-PHP takes 90x longer to run query than MySQL client。但是,我无法找到有关查询计划差异的任何信息。

这是一个仍在使用mysql_query的旧版应用程序。

  • PHP版本-5.6.34-1 + ubuntu16.04.1 + deb.sury.org + 1
  • Mysqlnd版本-mysqlnd 5.0.11-dev-20120503

0 个答案:

没有答案