为什么解释会根据MySQL中的用户返回不同的额外(filesort)?

为什么解释会根据MySQL中的用户返回不同的额外(filesort)?,mysql,Mysql,我的数据库有两个用户,root和readonly。补助金如下所示: mysql>为'root'@'localhost'显示授权; +---------------------------------------------------------------------+ |补助金root@localhost | +-------------------------------------------------

我的数据库有两个用户,
root
readonly
。补助金如下所示:

mysql>为'root'@'localhost'显示授权;
+---------------------------------------------------------------------+
|补助金root@localhost                                           |
+---------------------------------------------------------------------+
|使用GRANT选项将**上的所有权限授予“根”@“本地主机”|
|使用GRANT选项将“@”上的代理授予“根”@“本地主机”|
+---------------------------------------------------------------------+
一组2行(0.00秒)
mysql>显示“只读”@“本地主机”的授权;
+-----------------------------------------------+
|补助金readonly@localhost                 |
+-----------------------------------------------+
|将**上的SELECT授予“只读”@“本地主机”|
+-----------------------------------------------+
我有一个SELECT查询,当使用
readonly
用户进行解释时,返回以下内容:

+----+-------------+----------+-------+---------------+--------+---------+------+---------+----------------------------------------------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+----------+-------+---------------+--------+---------+------+---------+----------------------------------------------------+
|1 |简单| mv|U存储|范围|我的|我的|键| 768 |空| 787878512 |使用索引条件;在何处使用;使用文件排序|
+----+-------------+----------+-------+---------------+--------+---------+------+---------+----------------------------------------------------+
但是,当使用
根目录解释时,用户返回:

+----+-------------+----------+-------+---------------+--------+---------+------+---------+------------------------------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+----------+-------+---------------+--------+---------+------+---------+------------------------------------+
|1 |简单| mv|U存储|范围|我的|我的|键| 768 |空| 787878512 |使用索引条件;在哪里使用|
+----+-------------+----------+-------+---------------+--------+---------+------+---------+------------------------------------+
请注意根用户缺少的
filesort

在浏览了一些mysql文档之后,我无法合理地猜测为什么
filesort
会出现在
readonly
用户中,而
root
用户却没有,除了root用户正在做需要额外权限的事情之外。但我并不清楚这些是什么,也不清楚我将如何发现它们

以下是(生成的)查询:

选择
`键1`,
`键2`,
`键3`,
`键4`,
`不在按键1中,
`不在键2中,`,
`不在键3中,`,
`不在键4中`
从…起
`tbl`force index(`my_key`)
哪里
('value1'中的'key_col2')
和(0)中的'not_in_key1'
并且'not_in_key2'为空
和(1=0或'key\u col1`>'0'
或(`key\u col2`>'value1'和`key\u col1`='0')
或者(`key\u col3`>-9223372036854775808和`key\u col2`='value1'和`key\u col1`='0')
或(`key_col4`>`和`key_col3`=-9223372036854775808和`key_col2`='value1'和`key_col1`='0'))
和1=1)
订购人
`tbl`.`key_col1`asc,`tbl`.`key_col2`asc,`tbl`.`key_col3`asc,`tbl`.`key_col4`asc限制1000;
my\u key
包括
(key\u col1、key\u col2、key\u col3、key\u col4)

编辑:因此运行
EXPLAIN EXTENDED
,然后运行
SHOW WARNINGS
(如上所述)会显示
根用户查询已从
订单中删除
关键字2
。即订单行内容如下:

按`tbl`.`key\u col1`asc,`tbl`.`key\u col3`asc,`tbl`.`key\u col4`asc排序
我想这是有道理的,因为它由
子句中的
保持不变。如果我使用新语句和
readonly
用户进行解释,它将得到优化


为什么
root
用户可以这样优化查询,而不是
readonly
用户?

“使用文件排序”意味着它找不到同时满足Where和Order By子句的合适索引。我的索引键包含哪些列?我已经澄清了为什么只读用户使用filesort而根用户不使用filesort的问题。还添加了my_key所涵盖的内容。索引中不包含关键字1中的列not_和关键字2中的列not_,但它们位于where子句中。“很可能是这样的。”彼得布兰德遗憾地说,不是这样的。
root
用户可以使用索引而不是文件排序进行此查询,所以不是这样。当
readonly
userTest与具有完全权限的root用户以外的用户一起运行时,通过从查询中删除这些键进行双重检查仍然会有不良行为,或者将索引权限授予readonly,以查看这是否会产生影响。索引就在那里,使用它不需要特权,所以对我来说它听起来像个bug。也许是同花顺特权?您联系过mysql技术支持吗?“使用filesort”意味着它找不到同时满足Where和Order By子句的合适索引。我的索引键包含哪些列?我已经澄清了为什么只读用户使用filesort而根用户不使用filesort的问题。还添加了my_key所涵盖的内容。索引中不包含关键字1中的列not_和关键字2中的列not_,但它们位于where子句中。“很可能是这样的。”彼得布兰德遗憾地说,不是这样的。
root
用户可以使用索引而不是文件排序进行此查询,所以不是这样。当由
readonl运行时,通过从查询中删除这些键进行双重检查仍然会有不良行为