Mysql面试总结

1.索引建立字段选择
  离散度高,字段使用率高,字段尽量精简

1:为什么Mysql不多建立索引
  因为:每次DML都会对索引就行修改,B+树采用的分裂合并进行索引树的平衡,如果索引过多,每次DML的时候修改的索引多,会严重影响DML的效率.

为什么选用 B+Tree 不用B-Tree
1. B+Tree 是B-树的变种(PLUS版)多路绝对平衡查找树,它拥有B-树的优势。
2. B+Tree 扫库、表能力更强。
如果要从 B-Tree 中扫描表数据的话,基本要把整棵树都要扫描一遍,因为每个节点都存在数据区。B+Tree 就不需要扫描整棵树,只需要扫描叶子节点就可以了。
3. B+Tree 的磁盘读写能力更强。
B+Tree 的节点上是不保存数据的,那么它保存的关键字就更多,这样一次 IO 操作,加载的关键字就更多,所以它的磁盘读写能力更强。
4. B+Tree 的排序能力更强。
B+Tree 的叶子节点天然就是顺序存放的
5. B+Tree 的查询效率更加稳定。
比如我们从上图的 B-Tree 中查询一条 id 等于8的数据需要经过两次 IO 操作,查询一条 id 等于3的数据需要经过三次 IO 操作,而从上图的 B+Tree 中只有叶子节点才保存数据,所以查询任何数据都需要经过三次 IO 操作。 所以 B+Tree 的查询效率更加稳定


联合索引最左匹配原则
联合索引能够满足最左侧查询需求,例如 (a, b, c) 三列的联合索引,能够加速 a | (a, b) | (a, b, c) 三组查询需求,必须要有a检索条件b检索条件索引才生效,同理c必须有要a,b条件都在才能生效


索引的注意事项
1. 索引列不允许为空
2. 索引列的数据长度能少则少
3. 索引一定不是越多越好,越全越好,一定是建合适的
4. 匹配列前缀可用到索引 like 9999%,like %9999%、like %9999 用不到索引
5. where 条件中 not in 和 <> 操作无法使用索引
6. 匹配范围值,order by 也可用到索引
7. 多用指定列查询,只返回自己想到的数据列,少用 select *
8. 联合索引中如果不是按照索引最左列开始查找,无法使用索引
9. 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
10. 联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引

分页优化

SELECT * FROM t_good WHERE stock_number > 50
LIMIT 400000,100;

##上述sql 可用主键ID(serialNumber)进行优化,在数据量比较大,且主键id是自增的情况下
SELECT * FROM t_good WHERE  serialNumber >=( SELECT serialNumber FROM t_good WHERE stock_number > 50 LIMIT 400000, 1 ) and stock_number > 50
LIMIT 100;

in 和 exists以及 not in 和 not exists

#在t_goods表明显大于t_user表
#in 时大表驱小表   该用exists变成小表驱大表效率高很多
select  * from t_user where `name`in (select gname from t_good);
select * from t_user t where exists (select 1 from t_good t1 where t1.gname = t.name);

#同理这种情况in效率要高很多
select  * from t_good  where `gname`in (select name from t_user);
select * from t_good t where exists (select 1 from t_user t1 where t.gname = t1.name);

not exists 可以用上索引 而not in不能;


not in (x)里面含有null会什么数据都查不出来,in()可以 

你可能感兴趣的:(Mysql面试总结)