我今天在想这个问题......
例如,如果我有一个包含20个字段,100K行的innodb表....内存如何填充这两个不同的查询:
1) SELECT field1, field2, field3 from table where field10 = '1';
2) Select * from table where field10 = '1';
在两种情况下,内存是否都填满了整个表格? 当innodb_buffer_pool被填满时,如何考虑在哪里?
答案 0 :(得分:2)
如果您的field10
被编入索引,InnoDB只需要读取索引以查找具有该值的行。然后它需要读取包含这些行的表的页面。它不需要读取整个表格。
这是指数的好处。
如果索引还包括field1
,field2
,field3
,那么InnoDB可以跳过从表中读取的页面。它可以从索引中获取所需的值。
ALTER TABLE `table` ADD KEY (field10, field1, field2, field3);
有点像当你在电话簿中查找某人的名字而你发现他们的地址是“额外”字段时。这本书没有按人的地址排序,但你可以免费获得。
当您从索引中获取所需的列时,这称为覆盖索引,并且查询不必从表中读取整行。
您可能会喜欢我的演示文稿https://www.slideshare.net/billkarwin/how-to-design-indexes-really