Msc*_*iot 8 mysql indexing select
我有一个非常简单的查询:
SELECT comments.*
FROM comments
WHERE comments.imageid=46
Run Code Online (Sandbox Code Playgroud)
这是我的表:
CREATE TABLE IF NOT EXISTS `comments` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`imageid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` bigint(20) unsigned NOT NULL DEFAULT '0',
`content` text CHARACTER SET utf8,
`adate` datetime DEFAULT NULL,
`ip` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `ids` (`imageid`) USING BTREE,
KEY `dt` (`adate`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
Run Code Online (Sandbox Code Playgroud)
但是MySql不能在这个简单的查询上使用索引.这是解释结果:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE comments ALL ids NULL NULL NULL 4 75.00 Using where
Run Code Online (Sandbox Code Playgroud)
当我将查询更改为此时,Mysql可以使用索引.为什么?:
SELECT comments.id
FROM comments
WHERE comments.imageid=46
Run Code Online (Sandbox Code Playgroud)
这是解释:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE comments ref ids ids 4 const 4 100.00 Using index
Run Code Online (Sandbox Code Playgroud)
我猜你在'comments'表中有几行,这就是MySQL在你的第一个查询中进行全表扫描而不是使用索引的原因.它估计全表扫描的成本可能低于首先匹配索引然后查找行.
在您的第二个查询中使用索引,因为可以直接从索引获取查询的所有列('id'列),而不需要在匹配索引后查找表行.这是"使用索引"额外信息的含义.
尝试在"评论"中使用大量行仍然使用完全扫描,我认为这将是一种奇怪的行为.事实上,我在MySQL版本5.1中测试完全相同,即使只有很少的行,它总是使用'索引'.
| 归档时间: |
|
| 查看次数: |
5041 次 |
| 最近记录: |