我有这个问题:
SELECT * FROM table WHERE field = 'abcd';
表有很多行(1'000'000'000或更多)
如果不使用field ='abcd',我会使用类似
的内容SELECT * FROM table WHERE field = 'abcd' AND other_field = 300;
,其中300是一个依赖于'abcd'(f(abcd)=> 300)的数字,查询运行得更快吗?
答案 0 :(得分:2)
使用唯一索引时的搜索时间
MySQL使用BTree索引
这意味着在log(n)时间内找到唯一的行。
如果您搜索65536行,则假设完全平衡的树,最多需要16次比较才能找到该行
如果您搜索1,000,000,000,则需要30次比较才能找到该行,假设完全平衡的树和唯一值。
如果您搜索唯一键,添加额外测试几乎没有意义。
使用非唯一索引搜索时间
如果您在非唯一树上搜索,搜索时间会很快,但结果集当然会包含多于1行,并且查询时间会随着行数的增加而上升。
如果MySQL认为使用索引很有用,那么初始密钥将在极少数测试中找到。
然而,实际的时间花在了匹配的行上。