MySQL如何在where中使用函数索引?

MySQL如何在where中使用函数索引?,mysql,indexing,Mysql,Indexing,mysql如何在此查询中使用ts索引?(额外:使用where;使用索引) 模式: CREATE TABLE times( ts int(11) NOT NULL COMMENT 'timestamp', PRIMARY KEY (ts) ); INSERT INTO times VALUES (0), (1000), (5000), (10000), (15000), (20000), (600000), (7000000), (80000000), (900000000);

mysql如何在此查询中使用
ts
索引?(额外:使用where;使用索引)

模式:

CREATE TABLE times(
    ts int(11) NOT NULL COMMENT 'timestamp',
    PRIMARY KEY (ts)
);

INSERT INTO times VALUES (0), (1000), (5000), (10000), (15000),
(20000), (600000), (7000000), (80000000), (900000000);
SQL fiddle链接:

MySQL使用索引。为什么和如何

您能为我提供描述此功能的MySQL文档页面吗?

这与:

SELECT * 
  FROM times
 WHERE ts > UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(10000), 'EET', 'GMT'));
它可以愉快地使用索引。

这与:

SELECT * 
  FROM times
 WHERE ts > UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(10000), 'EET', 'GMT'));
它可以愉快地使用索引。

这与:

SELECT * 
  FROM times
 WHERE ts > UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(10000), 'EET', 'GMT'));
它可以愉快地使用索引。

这与:

SELECT * 
  FROM times
 WHERE ts > UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(10000), 'EET', 'GMT'));

它可以愉快地使用索引。

MySQL中的一个
BTREE
索引(大多数索引都是)有两个用途:它可以用于基于特定键随机和/或顺序访问表的数据。如果索引恰好包含查询所需的所有列,则该索引也可用于满足查询。在您的例子中,MySQL将您的索引用于后一个目的,而不是前者

您定义的索引可以完全满足您显示的查询。这叫做覆盖指数。这恰好是一个简单的情况,因为表中只有一列,并且它被索引。查看
解释
结果集中的
可能的\u键
,注意没有

这有点令人困惑。MySQL使用索引来满足查询,因为它需要的所有列都在索引中。但是,它不是使用键值访问索引。相反,它必须扫描整个事情

使用键随机访问索引不能满足对列名应用函数的查询。在示例案例中,WHERE子句的形式如下

WHERE f(g(h(column))) > value
如果你把这种不平等重新定义为

WHERE column > H(G(F(value)))
MySQL将使用该键进行搜索。它可以这样做,因为它将表达式的右侧转换为常量,然后使用该常量在第一个符合条件的值处随机访问索引。这叫做索引范围扫描

一些参考资料:


MySQL中的一个
BTREE
索引(大多数索引都是)有两个用途:它可以用于基于特定键随机和/或顺序访问表的数据。如果索引恰好包含查询所需的所有列,则该索引也可用于满足查询。在您的例子中,MySQL将您的索引用于后一个目的,而不是前者

您定义的索引可以完全满足您显示的查询。这叫做覆盖指数。这恰好是一个简单的情况,因为表中只有一列,并且它被索引。查看
解释
结果集中的
可能的\u键
,注意没有

这有点令人困惑。MySQL使用索引来满足查询,因为它需要的所有列都在索引中。但是,它不是使用键值访问索引。相反,它必须扫描整个事情

使用键随机访问索引不能满足对列名应用函数的查询。在示例案例中,WHERE子句的形式如下

WHERE f(g(h(column))) > value
如果你把这种不平等重新定义为

WHERE column > H(G(F(value)))
MySQL将使用该键进行搜索。它可以这样做,因为它将表达式的右侧转换为常量,然后使用该常量在第一个符合条件的值处随机访问索引。这叫做索引范围扫描

一些参考资料:


MySQL中的一个
BTREE
索引(大多数索引都是)有两个用途:它可以用于基于特定键随机和/或顺序访问表的数据。如果索引恰好包含查询所需的所有列,则该索引也可用于满足查询。在您的例子中,MySQL将您的索引用于后一个目的,而不是前者

您定义的索引可以完全满足您显示的查询。这叫做覆盖指数。这恰好是一个简单的情况,因为表中只有一列,并且它被索引。查看
解释
结果集中的
可能的\u键
,注意没有

这有点令人困惑。MySQL使用索引来满足查询,因为它需要的所有列都在索引中。但是,它不是使用键值访问索引。相反,它必须扫描整个事情

使用键随机访问索引不能满足对列名应用函数的查询。在示例案例中,WHERE子句的形式如下

WHERE f(g(h(column))) > value
如果你把这种不平等重新定义为

WHERE column > H(G(F(value)))
MySQL将使用该键进行搜索。它可以这样做,因为它将表达式的右侧转换为常量,然后使用该常量在第一个符合条件的值处随机访问索引。这叫做索引范围扫描

一些参考资料:


MySQL中的一个
BTREE
索引(大多数索引都是)有两个用途:它可以用于基于特定键随机和/或顺序访问表的数据。如果索引恰好包含查询所需的所有列,则该索引也可用于满足查询。在您的例子中,MySQL将您的索引用于后一个目的,而不是前者

您定义的索引可以完全满足您显示的查询。这叫做覆盖指数。这恰好是一个简单的情况,因为表中只有一列,并且它被索引。查看
解释
结果集中的
可能的\u键
,注意没有

这有点令人困惑。MySQL使用索引来满足查询,因为它需要的所有列都在索引中。但是,它不是使用键值访问索引。相反,它必须扫描整个事情

随机访问无法满足将函数应用于列名的查询