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