首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL如何在哪里使用索引作为函数?

MySQL如何在哪里使用索引作为函数?
EN

Stack Overflow用户
提问于 2014-07-30 15:22:10
回答 2查看 486关注 0票数 1

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

代码语言:javascript
复制
EXPLAIN SELECT * FROM times
WHERE UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(ts), 'GMT', 'EET')) > 10000;


| ID | SELECT_TYPE | TABLE |  TYPE | POSSIBLE_KEYS |     KEY | KEY_LEN |    REF | ROWS |                    EXTRA |
|----|-------------|-------|-------|---------------|---------|---------|--------|------|--------------------------|
|  1 |      SIMPLE | times | index |        (null) | PRIMARY |       4 | (null) |   10 | Using where; Using index |

模式:

代码语言:javascript
复制
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篡改链接:http://sqlfiddle.com/#!9/6aa3d/8

MySQL使用索引。为什么和怎么做?

你能给我提供描述这个特性的MySQL文档页面吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-30 15:31:12

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

您所显示的查询可以从您定义的索引中完全满足。这叫做覆盖指数。这恰好是一个微不足道的情况,因为表中只有一个列,而且它被索引了。查看一下您的POSSIBLE_KEYS结果集中的explain,并注意没有。

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

任何将函数应用于列名的查询都不能通过使用键访问索引来满足。在示例中,WHERE子句具有以下形式

代码语言:javascript
复制
WHERE f(g(h(column))) > value

如果你把这种不平等

代码语言:javascript
复制
WHERE column > H(G(F(value)))

MySQL将使用密钥进行搜索。它可以这样做,因为它将表达式的右侧转换为常量,然后使用常量随机访问第一个合格值的索引。这叫做索引范围扫描。

参考文献:http://planet.mysql.com/entry/?id=661727

http://www.mysqlperformanceblog.com/2006/11/23/covering-index-and-prefix-indexes/

票数 5
EN

Stack Overflow用户

发布于 2014-07-30 15:27:05

这与以下情况相同:

代码语言:javascript
复制
SELECT * 
  FROM times
 WHERE ts > UNIX_TIMESTAMP(CONVERT_TZ(FROM_UNIXTIME(10000), 'EET', 'GMT'));

它可以愉快地使用索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25040704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档