文章目录
- 1. 当用sql查找是否“存在”场景
- 2. where 条件 in的限制
- 3. updade语句要不要考虑索引的命中情况
- 4. mysql 预编译 多线程
- 5. 函数与索引失效的关系
- 6. mysql隐性类型转换与索引失效的关系
- 7. 联合索引
- 8. 联合索引最左匹配原则
- 9. 回表 索引覆盖 聚簇索引 非聚簇索引
- 10. 前缀索引 前缀系数注意点
- 11. collate 可以设置mysql区分大小写
- 12. explain cost
1. 当用sql查找是否“存在”场景
原sql:
select count(1) from table where a = 1
改为
select 1 from table where a = 1 limit 1
当确定查询结果就是一条时,勇敢的加上limit 1,使数据库查询到一条就返回;
这种判断是否存在的场景,不要再用count(1)、count(*)、count(字段)了
2. where 条件 in的限制
在oracle中,in()中的数量限制为1000;
在mysql中,没有对in()中数量进行限制,只是限制了sql语句的大小不能超过4MB,但是in中的数量较大时会使查询语句放弃索引,为了使用到索引,可以分多次查,比如一万条数据,分十次查,每次in中的数量为1000,虽然与数据库的连接次数变多了,但总体查询速度还是变快的,而且还有数据库连接池的存在,所以连接次数变大的影响很弱
3. updade语句要不要考虑索引的命中情况
update语句会先查询到更新的语句然后才进行更新,所以也是需要索引命中情况良好的
4. mysql 预编译 多线程
相同的语句,即时多次连接数据库执行,数据库也只会预编译一次,所以相同的语句一般不会使用多线程处理,而是不同的语句可以考虑使用多线程处理
5. 函数与索引失效的关系
<!-- 这种情况不会失去索引 -->
select name from table where name = upper(#{vo.name})
<!-- 这种情况会失去索引 -->
select name from table where upper(name) = #{vo.name}
6. mysql隐性类型转换与索引失效的关系
前情:id类型是bigint,name类型是varchar(注意引号的添加与否)
<!-- 这种情况不会失去索引 -->
select name from table where id = '1';
<!-- 这种情况会失去索引 -->
select name from table where name = xiaohua;
7. 联合索引
index(a, b, c)其实相当于创建了三个索引:
index(a)、index(a, b)、index(a, b, c),
所以创建了联合索引index(a, b, c),就没必要重复创建index(a)这种索引了,还会增加维护索引的开销
8. 联合索引最左匹配原则
乘上,
a. where条件是select name from table where b = 2, 这种时候就不会命中索引;
b. select select name from table where b = 2 and a =3,这个时候就会命中索引,注意最左匹配原则的最左所代码的顺序是索引定义时的顺序,而不是执行语句的顺序,因为mysql优化器会调整sql语句的,语句真正执行时候的样子并不是你写的样子;
c. 遇上判断等,索引会失效,但不是全部失效,而是定义时排在后面的索引会失效,比如:select name from table where b = 2 and a > 3 and c =4 那么a、b条件会命中索引,c不会;
9. 回表 索引覆盖 聚簇索引 非聚簇索引
回表:索引中的数据不够你用的,需要再去库中查;
索引覆盖:索引中的数据够你用的了,不需要回表到库中查了;
聚簇索引:回表时其实是根据主键去查数据,也就是说,索引中存储的是主键的地址和其他一些索引值,当你需要的值不在这个范围内,则需要根据主键地址回表查数据,聚簇索引指的就是索引中存储的是主键地址,需要更多数据时再根据主键去查数据的这种关系,可以认为聚簇索引就是主键相关
非聚簇索引:非主键索引
10. 前缀索引 前缀系数注意点
前缀索引的前缀系数的计算要注意字段的数据类型,当是varchar时,前缀系数指的就是字符数,但当字段类型是二进制,前缀系数指的就是字节数了,这个时候一般一个汉字三个字节,一个英文字母一个字节,当然不同的字符集也有区别
11. collate 可以设置mysql区分大小写
不建议使用,最好使用mysql默认的不区分大小写
12. explain cost
相比于explain 中的type来判断索引的使用情况,cost所指代的io和cpu花费情况更能反应一个sql语句的好坏