Indexing 使用了奇怪的MySQL索引

Indexing 使用了奇怪的MySQL索引,indexing,mysql-8.0,Indexing,Mysql 8.0,我使用的是MySQL 8,对于如何选择用于不同查询的索引,我仍然有一些疑问 表如下所示: CREATE TABLE IF NOT EXISTS`collection\u stats`( `id`BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `日期`日期不为空, `org_uuid`二进制(16)不为空, `project_uuid`二进制(16)不为空, `集合名称'VARCHAR(255)不为空, `计数器1`BIGINT未签名非空默认值0, `计数器2`B

我使用的是MySQL 8,对于如何选择用于不同查询的索引,我仍然有一些疑问

表如下所示:

CREATE TABLE IF NOT EXISTS`collection\u stats`(
`id`BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`日期`日期不为空,
`org_uuid`二进制(16)不为空,
`project_uuid`二进制(16)不为空,
`集合名称'VARCHAR(255)不为空,
`计数器1`BIGINT未签名非空默认值0,
`计数器2`BIGINT未签名非空默认值0,
`计数器3`BIGINT未签名非空默认值0,
主键(`id`),
索引'date\u INDEX'('date'ASC),
索引'org\u usage\u INDEX'('org\u uuid'ASC,'date'DESC),
索引`project\u usage\u INDEX`(`org\u uuid`ASC,`project\u uuid`ASC,`date`DESC),
唯一索引`collection\u usage\u INDEX`(`org\u uuid`ASC、`project\u uuid`ASC、`collection\u name`ASC、`date`DESC))
引擎=InnoDB;
我的想法是按组织、项目、集合(一个组织可以有多个项目,一个项目可以有多个集合)组织一些每日统计数据

我想查看过去X天内每个组织、每个项目或每个集合的
计数器1
计数器2
计数器3
的值

获取组织的统计信息:
解释选择
组织名称、项目名称、集合名称、,
柜台1,柜台2,柜台3
从集合_统计数据
哪里
org_uuid=uuid_TO_BIN('bb5c2330-1a85-11e9-8ad9-b728a2ed4173',1)和
日期>=日期(现在(),间隔10天)
我看到它使用的是
collection\u usage\u index
而不是
org\u usage\u index
,但我对此没有解释

获取项目级别的统计信息
解释从集合统计中选择组织、项目、集合名称、计数器1、计数器2、计数器3
哪里
org_uuid=uuid_TO_BIN('bb5c2330-1a85-11e9-8ad9-b728a2ed4173',1)和
项目uuid=uuid至垃圾箱('faafad18-1a85-11e9-8a1d-b7281ece80f6',1)和
日期>=日期(现在(),间隔10天)
解释也是如此。使用
collection\u usage\u index
代替
project\u usage\u index


对此有什么合乎逻辑的解释吗。我的表只有几行要测试?可能是原因吗?

您正在使用
WHERE
子句中的函数。据我所知,MySQL无法使用函数和索引。

您可以通过将
date>=date\u SUB(NOW(),INTERVAL 10 DAY)
更改为
date>=$date
进行验证,然后进行检查

您正在使用
WHERE
子句中的函数。据我所知,MySQL无法使用函数和索引。

您可以通过将
date>=date\u SUB(NOW(),INTERVAL 10 DAY)
更改为
date>=$date
进行验证,然后进行检查

最左边的前缀不应该只引用WHERE子句中的列?无论如何,从SELECT中删除列也不会带来任何区别。@silviu:我更新了我的答案。我已经忘记了mysql和函数即使我从clauseIt中删除函数,它们也没有变化。很难知道优化器为什么选择某种方法。可能是
project\u uuid
date
的选择性不够,因此它也选择了带有
集合名称的索引。您还可以强制使用哪个索引最左边的前缀不应该只引用WHERE子句中的列?无论如何,从SELECT中删除列也不会带来任何区别。@silviu:我更新了我的答案。我已经忘记了mysql和函数即使我从clauseIt中删除函数,它们也没有变化。很难知道优化器为什么选择某种方法。可能是
project\u uuid
date
的选择性不够,因此它也选择了带有
集合名称的索引。还可以强制使用哪个索引
# id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
'1', 'SIMPLE', 'collection_stats', NULL, 'ref', 'collection_usage_index,date_index,org_usage_index,project_usage_index', 'collection_usage_index', '16', 'const', '8', '100.00', 'Using index condition'