一、mybatis的优缺点
优点:
缺点:
二、MySql索引
1、索引的基本原理:
2、索引类型及对
3、索引对数据库的性能的影响:
4、怎样创建一个索引
创建普通索引: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建联合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;
创建反向键索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;
5、什么情况下不推荐使用索引
1.数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。
2.频繁更新的字段不要使用索引
比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。
3.字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引
只有在where语句出现,mysql才会去使用索引
4.where 子句里对索引列使用不等于(<>),使用索引效果一般
6、什么情况下索引失效
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
select * from tb1 where nid = 1 or name = 'seven@live.com';
--特别的:当or条件中有未建立索引的列才失效,以下会走索引
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'
2.对于多列索引,查询条件中不使用这些字段中的第1个字段时,索引会失效
3.like查询以%开头会导致索引失效
select * from tb1 where email like '%cn';
4.列类型是字符串时一定要在条件中加上单引号,否则不使用索引
select * from tb1 where email = 999;
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
6.普通索引的不等于(!=或者> <)会导致索引失效,直接全表扫描
- !=
select * from tb1 where email != 'alex'
--特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123
- >
select * from tb1 where email > 'alex'
--特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123
select * from tb1 where num > 123
7.组合索引遵循“最左前缀”原则
如果组合索引为:(name,email),则如下
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引
8.在索引列上进行操作(计算、函数、类型转换)会导致索引失效,而进行全表扫描
7、mysql聚簇和非聚簇索引的区别
都是B+树的数据结构
- 聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的
- 非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据。
8、mysql索引的数据结构,各自优劣
B+树:
哈希索引:
hash索引优缺点:
1.如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;前提是键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
2.如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
3.哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
4.哈希索引也不支持多列联合索引的最左匹配规则;