Mysql - “SELECT field”确实将内存填充为“SELECT *”? - Innodb

时间:2017-04-18 18:53:03

标签: mysql memory memory-management innodb

我今天在想这个问题......

例如,如果我有一个包含20个字段,100K行的innodb表....内存如何填充这两个不同的查询:

1) SELECT field1, field2, field3 from table where field10 = '1';

2) Select * from table where field10 = '1';

在两种情况下,内存是否都填满了整个表格? 当innodb_buffer_pool被填满时,如何考虑在哪里?

1 个答案:

答案 0 :(得分:2)

如果您的field10被编入索引,InnoDB只需要读取索引以查找具有该值的行。然后它需要读取包含这些行的表的页面。它不需要读取整个表格。

这是指数的好处。

如果索引还包括field1field2field3,那么InnoDB可以跳过从表中读取的页面。它可以从索引中获取所需的值。

ALTER TABLE `table` ADD KEY (field10, field1, field2, field3);

有点像当你在电话簿中查找某人的名字而你发现他们的地址是“额外”字段时。这本书没有按人的地址排序,但你可以免费获得。

当您从索引中获取所需的列时,这称为覆盖索引,并且查询不必从表中读取整行。

您可能会喜欢我的演示文稿https://www.slideshare.net/billkarwin/how-to-design-indexes-really