Indexing 使用了奇怪的MySQL索引
我使用的是MySQL 8,对于如何选择用于不同查询的索引,我仍然有一些疑问 表如下所示: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
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'