0

在发布此内容时,我很困惑。我不明白为什么当我在 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 中的输出:

  • 编号 - 1
  • select_type - 简单
  • 表 - sales_table
  • 分区 - NULL
  • 类型 - 参考
  • possible_keys - 客户 ID
  • 键 - 客户 ID
  • key_len - 22
  • 参考 - 常量
  • 行 - 1
  • 过滤 - 100
  • 额外 - NULL

解释从 PHP 触发时的输出:

  • 编号 - 1
  • select_type - 简单
  • 表 - sales_table
  • 分区 - NULL
  • 类型 - 全部
  • possible_keys - 客户 ID
  • 键 - 空
  • key_len - 空
  • 参考 - 空
  • 行 - 1772719
  • 过滤 - 10.00
  • 额外 - 使用 where

如您所见,解释输出有很大不同。由于这种差异,从我的 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 运行查询的时间比 MySQL 客户端长 90 倍。但是,我无法找到有关查询计划差异的任何信息。

这是一个仍在使用 mysql_query 的遗留应用程序。

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

0 回答 0