优化器的逻辑
优化器选择索引的目的是选择一个执行方案,用最小的代价去执行语句。
数据库里影响执行代价的因素。
1)扫描行数 ,扫描的行数越少,意味着访问磁盘的数据的次数越小,消耗cpu的资源越少
2)是否使用临用表
2)是否排序
Mysql是如何得到索引的激素和
选错索引的场景
我们平常不断删除历史数据和新增数据索引时可能会导致数据库选错索引
解决方案
对于索引统计信息不准确导致的问题,你可以用 analyze table 来解决。
而对于其他优化器误判的情况,你可以在应用端用 force index 来强行指定索引,也可以通过修改语句来引导优化器,还可以通过增加或者删除索引来绕过这个问题。
提出问题:
mysql> select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1;
给a或b加一个索引 你觉得哪种速度更快
答案: 用a
因为以a为索引 会先用索引查询1000条数据 然后在根据b between 50000 and 100000 的条件过滤,
如果以b为索引 会先查询50000条数据再根据a的条件过滤
我当时想的and语句会分别查询a 和b的行然后求交集再排序 ,由于排序的时候是b所以我想选b为索引