Mysql相关知识
Mysql中int、bigint、smallint 和 tinyint的区别详细介绍
Mysql之动态SQL
Mysql之批量更新update foreach
第一种方式:一条update
<update id="updateThreadreturnList" parameterType="java.util.List">
update table_name set isDelete=0
where id in (
<foreach collection="list" item="item" index="index" open="" close="" separator=",">
#{item.id}
</foreach>
)
</update>
第二种方式:多条update
注意 需要在数据库添加 &allowMultiQueries=true
jdbc:mysql://192.168.1.109:3306/healthmanage?characterEncoding=utf-8&allowMultiQueries=true
<update id="updateQuestionseleteTempalteList" parameterType="java.util.List">
<foreach collection="list" item="item" index="index">
update table_name set selectedName=#{item.selectedName}
where 1=1 and selectedId =#{item.selectedId };
</foreach>
</update>
Mysql之Having与Where的区别
Mysql之INSERT、UPDATE 获取自增主键(useGenerateKey与KeyProperty)
MySQL之如何在数据库事务提交成功后进行异步操作
MySQL之逻辑架构图
MySQL之最左前缀原则
mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;
1、b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。
2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)
关于最左前缀的使用,有下面两条说明:
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
关于最左前缀的例子,请参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41857
MySQL之什么时候索引会失效
- 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
- 对于多列索引,不是使用的第一部分,则不会使用索引(即不符合最左前缀原则)
- like查询是以%开头
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
此外,查看索引的使用情况
show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效