随笔分类 - MySQL
摘要:Mybatis中使用了JDK反射机制和CGLIB代理 反射机制,通过 Class.forName 加载类,通过方法的 invoke 反射调用方法 JDK动态代理 MyBatis的 Mapper 采用的就是 JDK 动态代理 import java.lang.reflect.InvocationHan
阅读全文
摘要:SqlSessionFactoryBuilder 利用 xml 或者 Java 编码获得资源来构建 SqlSessionFactory,通过它可以构建多个 SessionFactory 它的生命周期只存在于方法的局部 SqlSessionFactory 作用是创建 SqlSession,SqlSes
阅读全文
摘要:排序成本高 尽可能减少排序或者避免对大量数据排序 当不能使用索引生成排序结果的时候,数据量小在内存排序,数据量大使用磁盘 filesort 如果需要排序的数据量小鱼"排序缓冲区",MySQL使用内存进行"快速排序"操作 如果内存不够排序,MySQL会先将数据分块,对每个独立的块进行快速排序,然后将排
阅读全文
摘要:UNION查询 将一系列单个查询结果放到一个临时表中,然后再重新读出临时表数据来完成UNION查询 每个查询都是一次关联,读取结果临时表也是一次关联 MySQL 关联执行策略 MySQL 对任何关联都执行嵌套循环关联操作,即先在一个表中取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行 直到找到所
阅读全文
摘要:采用分治思想,将大查询切分成小查询 比如将大数据量的删除分批进行 分解关联查询优势 缓存效率更高,拆分后如果某个表很少改变,基于该表的查询就可以重复利用查询缓存结果了 将查询分解后,执行单个查询可以减少锁的竞争 在应用层做关联,容易对数据库拆分 查询本身效率有所提升 减少冗余记录的查询,在应用层关联
阅读全文
摘要:单行访问是很慢的 在机械硬盘存储中IO尤其慢,SSD随机IO会快一些 读取的块中尽可能多包含所需要的行,用索引可以创建位置引用,提升效率 按顺序访问范围数据是很快的 顺序IO不需要多次磁盘寻道,比随机IO快很多 如果服务器能够需要顺序读取数据,不需要额外的排序操作,GROUP BY无需排序和聚合计算
阅读全文
摘要:使用 show index from 查看索引基数 存储引擎估算索引列有多少个不同的取值,选择合适的索引 减少索引和数据的碎片 行碎片(Row Fragmentation) 数据被存储在多个地方的多个片段中,就算查询只从索引中访问行记录,行碎片也会导致性能下降 行间碎片(Intra-row Frag
阅读全文
摘要:索引可以让查询锁定更少的行 锁定超过需要的行会增加锁争用并减少并发性 InnoDB只有在访问行的时候才会加锁,索引能减少InnoDB访问的行数 这条查询返回2~4之间的行,实际上获取了1~4之间的行排他锁 Using where,表示MySQL服务器将存储引擎返回行后再应用WHEER过滤条件 Inn
阅读全文
摘要:官方网站:https://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html 多范围读取优化(MRR) explain语句 当表很大且未存储在存储引擎的缓存中时,使用二级索引上的范围扫描读取行可能会导致对基表的许多随机磁盘访问。 通过磁盘扫描多
阅读全文
摘要:安装mysql mysql仓库:https://repo.mysql.com/ 获取rpm包 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 安装rpm包 sudo rpm -ivh mysql-communit
阅读全文
摘要:衡量查询开销的指标 响应时间 扫描的行数 返回的行数 它们大致反映了MySQL在内部执行查询时,需要访问多少数据,可以大概推算出查询运行的时间 响应时间 响应时间 = 服务时间 + 排队时间 使用快速上限估计法,来查询响应时间 扫描的行数和返回的行数字 分析查询时,查看该查询扫描的行数很有帮助,理想
阅读全文
摘要:是否向数据库请求了不需要的数据 查询不需要的数据 一个常见的错误是误以为MySQL只返回需要的数据,实际上先返回全部结果集再计算 最有效的解决办法是在查询后面加上LIMIT 多表关联时返回全部列 在 JOIN 操作时返回了所有表的列 只需要一个表的列 重复查询相同的数据 初次查询的时候将数据缓存起来
阅读全文
摘要:EXPLAIN看范围查询,从type列来看是range 对于范围条件,MySQL无法使用范围列后面的其他索引列,但是对于多个等值条件查询没有这个限制 可以通过程序添加一列将范围查询转化为等值查询,从而避免索引失效
阅读全文
摘要:MySQL有两种方式可以生成有序的结果,排序或者索引顺序扫描 explain出来的type列值为 index,说明MySQL使用了索引扫描做排序 扫描索引本身很快,只需要从一条索引记录移动到紧接的另一条索引记录 但如果索引不能覆盖查询所需要的全部列 必须每扫描一条索引记录都回表查询一次对应的行,这种
阅读全文
摘要:用IN组合索引触发WHERE最左前缀 假如(sex,country,age),(sex,country,region,age)和(sex,country,region,city,age) 这样的组合索引,可以通过IN(),来重用索引而不是建立大量新的组合索引 这种技巧不能滥用 每额外增加一个IN()
阅读全文
摘要:索引可以让查询锁定更少的行 如果你的查询从不访问那些不需要的行,那么就会锁定更少的行 InnoDB只有访问行的时候才会对其加锁,索引能够减少InnoDB访问的行数,从而减少锁的数量 只有在InnoDB在存储引擎层能够过滤掉所有不需要的行时才有效,如果索引无法过滤掉无效的行 在InnoDB检索到数据返
阅读全文
摘要:重复索引 在相同的列上按照相同的顺序创建相同类型的索引 通常除了创建不用类型索引来满足不同的查询需求,没有理由这样做 如果索引类型不同,并不算是重复索引 冗余索引 如果创建了索引(A,B),再创建索引(A)就是冗余索引 索引(A,B)可以当作索引(A)来用,这种冗余是针对B-tree索引来说的 大部
阅读全文
摘要:MyISAM数据分布非常简单,按照数据插入顺序存储在磁盘上 表 MyISAM数据分布 数据分布 InnoDB数据分布 在InnoDB中,聚簇索引就是表,不像MyISAM那样需要独立的行存储 聚簇索引每一个叶子结点包含了主键值、事务ID、用于事务和MVCC的回滚还真以及所有剩余列 InnoDB二级索引
阅读全文
摘要:一个索引包含所有需要查询的字段,称之为"覆盖索引" 覆盖索引,查询只需要扫描索引而无须回表,优点 索引条目远小于数据行大小,如果只需要读取索引,MySQL会极大减少数据访问量 这对缓存负载非常重要,这种情况下响应时间大部分花在数据拷贝上 对IO密集型应用也有帮助,索引更容易全部放入内存中 索引按照列
阅读全文