使用伪’loose index scan’优化max

  • 时间:
  • 浏览:1
  • 来源:大发彩神官方下载—大发彩神苹果版下载

同理当亲戚朋友在in list中传入单个值的刚刚索引为 (log_machine, log_time):

1 row in set (0.00 sec)

+————-+———————+

| 1 | SIMPLE | log_table | range | ix_log_machine_time | ix_log_machine_time | 62 | NULL | 18 | Using where; Using index for group-by |

-> FROM log_table

log_time DATETIME NOT NULL

-> FROM log_table

+—-+————-+——-+——+—————+——+———+——+——+——————————+

root@test 10:52:21>explain SELECT log_machine, MAX(log_time) max_log_time

root@test 10:47:17>SELECT log_machine, MAX(log_time)

root@test 10:51:44>SELECT log_machine, MAX(log_time) max_log_time

+—-+————-+———–+——-+———————+———————+—-

+—-+————-+——-+——+—————+——+———+——+——+—–

root@test 10:16:18>explain SELECT MAX(log_time)

| Machine 1 | 2010-05-07 23:59:13 |

+—-+————-+———–+——-+———————+———————+—-

-> WHERE log_machine IN (‘Machine 1′,’Machine 2′,’Machine 3′,’Machine 4’)

CREATE TABLE log_table (

从执行计划中亲戚朋友都都后能 清楚看到优化器使用到了using index for group by,原先就都都后能 让优化器使用“伪松散索引扫描”,最终达到优化的目的;

-> limit 1;

从执行计划中亲戚朋友中,亲戚朋友都都后能 看到端倪,优化器和上端一样都都都都后能 直接找到满足条件的最大log_time,不过这次优化器时要首先在索引中定位到Machine 1,接着在

SELECT MAX(log_time)

-> ;

root@test 10:47:15>SELECT log_machine, MAX(log_time)

有刚刚亲戚朋友会遇到以下的应用场景:

-> FROM log_table

-> FROM log_table

+————-+———————+

你什儿 刚刚是愿因亲戚朋友换某种想法,把每个machine的最大log_time计算出来,我希望在计算一次所有machine的中最大的log_time,原先不仅都都后能 利用优化器都都都都后能 直接得到每个machine的最大log_time的优化特点,我希望还可大大减少参与计算的行,原先就都都后能 明显提升性能:

+—-+————-+——-+——+—————+——+———+——+——+—–

+—-+————-+——-+——+—————+——+———+——+——+—–

+————-+———————+

root@test 10:21:15>explain select max(log_time) from log_table;

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

| log_machine | max_log_time |

| Machine 3 | 2010-05-07 23:58:41 |

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

-> group by log_machine

1 row in set (0.65 sec)

CREATE INDEX ix_log_machine_time ON log_table (log_machine, log_time);

| log_machine | MAX(log_time) |

| Machine 4 | 2010-05-07 23:56:29 |

4 rows in set (0.00 sec)

当然亲戚朋友的索引时建立在log_time上的单列索引,你什儿 刚刚优化器发现不需要扫描所有的叶子节点,而直接到最右叶子节点的尾部就都都后能 得到最大的log_time;

-> WHERE log_machine IN (‘Machine 1′,’Machine 2′,’Machine 3′,’Machine 4’)

+—-+————-+———–+——-+———————+———————+—-

+————-+———————+

+————-+———————+

log_machine VARCHAR(20) NOT NULL,

-> FROM log_table

+—-+————-+——-+——+—————+——+———+——+——+—–

FROM log_table

+—-+————-+———–+——-+———————+———————+—-

| log_machine | MAX(log_time) |

mysql也会扫描起点和终点范围内的所有行;

首先亲戚朋友看看下面的查询:

+————-+———————+

root@test 10:47:10>explain SELECT log_machine, MAX(log_time)

| Machine 1 | 2010-05-07 23:59:13 |

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

-> WHERE log_machine IN (‘Machine 1′,’Machine 2′,’Machine 3′,’Machine 4’);

| 1 | SIMPLE | log_table | range | ix_log_machine_time | ix_log_machine_time | 62 | NULL |569160  | Using where; Using index |

-> FROM log_table

+————-+———————+

| Machine 2 | 2010-05-07 23:58:42 |

+—-+————-+———–+——-+———————+———————+—-

-> group by log_machine;

亲戚朋友建立的索引为:(log_machine,log_time),当亲戚朋友传入单个machine的刚刚,带宽变慢,我希望当亲戚朋友传入多个machines的刚刚,查询带宽会一下子就降下来;

在mysql 5.5刚刚,mysql对loose index scan不需要支持,这就愿因mysql的索引扫描通常时要有一一一个多多多确定的起点和终点,即使查询只时要其中否则 不连续的行,

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |

执行时间从0.65s降到了0.00s,你什儿 优化带宽是非常明显的;

-> WHERE log_machine IN (‘Machine 1′,’Machine 2′,’Machine 3′,’Machine 4’)

+—-+————-+——-+——+—————+——+———+——+——+—–

-> order by max_log_time desc

亲戚朋友看到有569160 行参加了运算;

-> group by log_machine ;

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

你什儿 系列前缀值都为machine 1的记录中,在直接在定位到最后到三根绳子 记录;

id INT NOT NULL PRIMARY KEY,

+————-+———————+

这麼是愿因不支持loose index scan,现在亲戚朋友传入的是有一一一个多多多list,mysql不得不把所有满足在list中的machine的记录查询出来,我希望在什么记录中得到最大的log_time;

+—-+————-+———–+——-+———————+———————+—-

-> WHERE log_machine IN (‘Machine 1′,’Machine 2′,’Machine 3′,’Machine 4’);

-> WHERE log_machine IN (‘Machine 1’)

1 row in set (0.00 sec)

| Machine 1 | 2010-05-07 23:59:13 |

WHERE log_machine IN ($machines)

猜你喜欢

小学四年级作文《一次有趣的实验》200字

我用2个多 碗,上边盛满水,因为你这时把2个多 鸡蛋放下去话语,鸡蛋肯定就沉下去了。我问妈妈:“妈妈,有有哪些好最好的最好的方法能让水里的鸡蛋浮起来吗?”“当然有了,你往碗

2020-02-26

请问那些大神写小说都用些什么软件?

可选中另俩个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题图片。下载百度知道APP,抢鲜体验 我来答为你推荐:5好了,回到工具问题图片,工欲善其事必先利

2020-02-26

centos7安装redmine3,并升级redmine1.8到3

生成密钥怎么让导入到redmine3的数据库中为nginx安装passenger6.升级redmine修改生成sercet.ymlredmine是一款项目管理开源工具,能也能自

2020-02-26

C2B前还有S2b,阿里携手产学研探索新零售时代的供应链未来

这些产品在未来都还并能实现为单个消费者的定制,而对需求精准快速的满足,可能性是俩个多 高效协同的供应链体系。本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yq

2020-02-25

哪些小事儿能让程序员幸福地晕过去咧?

这是一一另一个多 神奇的的话,一般优达君不随便泄露……不管是在我们歌词 都快速帮你自动化地完成了一一另一个多 手工要做上一一另一个多 礼拜的工作,又将会就是 我们歌词

2020-02-25