Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL/memSQL在连接条件之间未使用索引_Mysql_Query Optimization_Sqlperformance_Singlestore - Fatal编程技术网

MySQL/memSQL在连接条件之间未使用索引

MySQL/memSQL在连接条件之间未使用索引,mysql,query-optimization,sqlperformance,singlestore,Mysql,Query Optimization,Sqlperformance,Singlestore,我们有两张桌子: 一个日期表,其中包含过去10年和未来10年中每天的一个日期 状态表具有以下列:开始日期,结束日期,状态 我们运行的查询如下所示: SELECT dates.date, COUNT(*) FROM dates JOIN states ON dates.date BETWEEN states.start_date AND states.end_date WHERE dates.date BETWEEN '2017-01-01' AND '2017-01-31' GROUP BY

我们有两张桌子:

  • 一个
    日期
    表,其中包含过去10年和未来10年中每天的一个日期
  • 状态
    表具有以下列:
    开始日期
    结束日期
    状态
我们运行的查询如下所示:

SELECT dates.date, COUNT(*)
FROM dates
JOIN states
ON dates.date BETWEEN states.start_date AND states.end_date
WHERE dates.date BETWEEN '2017-01-01' AND '2017-01-31'
GROUP BY dates.date
ORDER BY dates.date;
根据查询计划,memSQL没有在连接条件上使用索引,这使得查询速度变慢。有没有办法在连接条件上使用索引

我们尝试在dates.date、states.start\u date、states.end\u date(states.start\u date、states.end\u date)上使用memSQL skiplist索引

表格和说明:

CREATE TABLE `dates` (
  `date` date DEFAULT NULL,
  KEY `date_index` (`date`)
)

CREATE TABLE `states` (
  `start_date` datetime DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `state` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  KEY `start_date` (`start_date`),
  KEY `end_date` (`end_date`),
  KEY `start_date_end_date` (`start_date`,`end_date`),
)

+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                             |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| GatherMerge [remote_0.date] partitions:all est_rows:96 alias:remote_0                                                                               |
| Project [r2.date, CAST(COALESCE($0,0) AS SIGNED) AS `COUNT(*)`] est_rows:96                                                                         |
| Sort [r2.date]                                                                                                                                      |
| HashGroupBy [SUM(r2.`COUNT(*)`) AS $0] groups:[r2.date]                                                                                             |
| TableScan r2 storage:list stream:no                                                                                                                 |
| Repartition [r1.date, `COUNT(*)`] AS r2 shard_key:[date] est_rows:96 est_select_cost:26764032                                                       |
| HashGroupBy [COUNT(*) AS `COUNT(*)`] groups:[r1.date]                                                                                               |
| Filter [r1.date <= states.end_date]                                                                                                                 |
| NestedLoopJoin                                                                                                                                      |
| |---IndexRangeScan drstates_test.states, KEY start_date (start_date) scan:[start_date <= r1.date] est_table_rows:123904 est_filtered:123904         |
| TableScan r1 storage:list stream:no                                                                                                                 |
| Broadcast [dates.date] AS r1 distribution:tree est_rows:96                                                                                          |
| IndexRangeScan drstates_test.dates, KEY date_index (date) scan:[date >= '2017-01-01' AND date <= '2017-01-31'] est_table_rows:18628 est_filtered:96 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
创建表“日期”(
`date`date默认为空,
键'date\u index`('date`)
)
创建表“states”(
`开始日期`日期时间默认为空,
`end_date`datetime默认为空,
`state`varchar(256)字符集utf8 COLLATE utf8\u general\u ci DEFAULT NULL,
键“开始日期”(“开始日期”),
键“结束日期”(“结束日期”),
键“开始日期”和“结束日期”(“开始日期”,“结束日期”),
)
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
|说明|
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
|GatherMerge[remote\u 0.date]分区:所有est\u行:96别名:remote\u 0|
|项目[r2.date,转换为'COUNT(*)`,共有行数:96|
|排序[r2.日期]|
|HashGroupBy[SUM(r2.`COUNT(*)`)作为$0]组:[r2.date]|
|TableScan r2存储:列表流:否|
|将[r1.date,`COUNT(*)`]重新分区为r2切分键:[date]est\u行:96 est\u select\u成本:26764032|
|HashGroupBy[COUNT(*)作为'COUNT(*)`]组:[r1.date]|
|过滤器[r1.date]
基本上是不可优化的。执行此测试的唯一实用方法是乏味地测试每一行

如果你使用MySQL而不需要<代码>日期>代码>表,请考虑从

开始。
SELECT  *
    FROM  states
    WHERE  start_date >= '2017-01-01'
      AND  end_date    < '2017-01-01' + INTERVAL 1 MONTH 
选择*
来自美国
其中开始日期>='2017-01-01'
截止日期<'2017-01-01'+间隔1个月
请注意,这适用于
DATE
DATETIME
数据类型的任何组合

由于我不清楚最终目标,我不清楚下一步该做什么

基本上是不可优化的。执行此测试的唯一实用方法是乏味地测试每一行

如果你使用MySQL而不需要<代码>日期>代码>表,请考虑从

开始。
SELECT  *
    FROM  states
    WHERE  start_date >= '2017-01-01'
      AND  end_date    < '2017-01-01' + INTERVAL 1 MONTH 
选择*
来自美国
其中开始日期>='2017-01-01'
截止日期<'2017-01-01'+间隔1个月
请注意,这适用于
DATE
DATETIME
数据类型的任何组合


由于我不清楚最终目标,我不清楚下一步该做什么。

你能发布解释和表声明吗?@Kickstart补充道。你加入的日期与DATETIME相对,这可能会使MySQL忽略索引(而倾向于在WHERE子句中的日期上使用索引)。如果你需要dates表(如果使用左外联接,则假定为空天数)那么,您能否尝试添加开始和结束日期时间字段,并加入这些字段以避免转换?@Kickstart谢谢。我继续创建了一个datetimes表来替换日期表,以便在相同的数据类型上进行比较-EXPLAIN的输出看起来相同。您能否解释一下您所说的
尝试添加开始和结束日期时间字段的意思nd date time字段,并在这些字段上加入以避免转换
?值得注意的是,这不是MySQL,而是memSQL。如果您不使用MySQL,请删除该标记。是否可以发布解释和表声明?@Kickstart已添加。您加入的日期与日期时间相对,这可能会允许MySQL忽略索引(而是倾向于在WHERE子句中使用日期索引)。如果需要日期表(如果使用左外联接,则假定为空天数)那么,您能否尝试添加开始和结束日期时间字段,并加入这些字段以避免转换?@Kickstart谢谢。我继续创建了一个datetimes表来替换日期表,以便在相同的数据类型上进行比较-EXPLAIN的输出看起来相同。您能否解释一下您所说的
尝试添加开始和结束日期时间字段的意思nd date time字段,并加入这些字段以避免转换
?值得注意的是,这不是MySQL,而是memSQL。如果您不使用MySQL,请删除该标记。