《高性能MySQL》のMySQL高级特性
2016-04-22 00:00
573 查看
摘要: 本书讲述到定稿前的MySQL5.5版,所以下面内容的适用范围止步于MySQL5.5。本文仅仅强调书中讲述的重中之重,
以便快速查阅,详细的内容还请认真阅读书本和MySQL的官方文档
以便快速查阅,详细的内容还请认真阅读书本和MySQL的官方文档。
CURD操作都会先代开并锁住所有的底层表,然后在解锁不需要的表。所以并不是在处理过程中都锁住表。
想大批量地删除数据,可以使用清除整个分区的方式。
分区表可以分布在不同的物理设备上。
避免某些特殊瓶颈。如ext3文件系统的inode锁竞争。
可以备份和恢复独立的分区。
<!-- more -->
有些存储引擎不支持分区。
在创建分区时可以使用表达式,但在查询时却只能根据列来过滤分区。
分区列和索引列不匹配。
选择分区成本的成本很高时。
打开并锁住底层表的成本很高时(若本身查询操作是快速的)。
先执行视图的查询语言生成临时表,再通过临时表执行查找。视图中包含GROUP BY、DISTINCT、任何
聚合函数、UNION、子查询等,只要无法在原表记录和视图记录中建立一一映射的场景时,只能采用临时表算法。
合并算法
将定义视图的语句与查询语句合并,进行一次查询操作。
不支持物化视图。
有些情况视图不可以被更新(包括更改联接键,视图定义使用聚合函数等)。
MySQL目前不支持触发器。
建议通过应用程序而不是外键来维护数据的完整性。
可以节省很多网络开销,也可以操纵一些没有权限的表,但是bug较多,使用时要慎重考虑。
某些优化器的工作只需要执行一次。
以二进制方式只发送参数和句柄,比起每次都发送ASCII码文本效率更高。
如果希望有更高的缓存效率,最好在应用程序提供缓存。
被缓存的查询本身消耗巨大,即使缓存命中率非常低,也仍然会对系统性能提升有好处。
以便快速查阅,详细的内容还请认真阅读书本和MySQL的官方文档
0x00前言
本书讲述到定稿前的MySQL5.5版,所以下面内容的适用范围止步于MySQL5.5。本文仅仅强调书中讲述的重中之重,以便快速查阅,详细的内容还请认真阅读书本和MySQL的官方文档。
0x01简介
本章讨论了MySQL的分区表,视图,外键,存储过程,绑定变量,插件,字符集,全文索引,XA事务,查询缓存。0x02具体
分区表
适用于大数据量的过滤场景,或者数据分为历史数据和热点数据,对于单条记录的查询并没有多少优势。原理
通过句柄对象转化成对存储引擎的接口调用,对于SQL层是完全封装底层实现的黑盒子。CURD操作都会先代开并锁住所有的底层表,然后在解锁不需要的表。所以并不是在处理过程中都锁住表。
适用条件
表非常大,或者表的最后部分是热点数据,其余是历史数据。想大批量地删除数据,可以使用清除整个分区的方式。
分区表可以分布在不同的物理设备上。
避免某些特殊瓶颈。如ext3文件系统的inode锁竞争。
可以备份和恢复独立的分区。
<!-- more -->
限制和性能问题
所用分区都必须使用相同的存储引擎。有些存储引擎不支持分区。
在创建分区时可以使用表达式,但在查询时却只能根据列来过滤分区。
分区列和索引列不匹配。
选择分区成本的成本很高时。
打开并锁住底层表的成本很高时(若本身查询操作是快速的)。
视图
简化应用程序的SQL语句编写(诸如表联结),或者使用视图实现基于列的权限控制,重构schema等。原理
临时表算法先执行视图的查询语言生成临时表,再通过临时表执行查找。视图中包含GROUP BY、DISTINCT、任何
聚合函数、UNION、子查询等,只要无法在原表记录和视图记录中建立一一映射的场景时,只能采用临时表算法。
合并算法
将定义视图的语句与查询语句合并,进行一次查询操作。
性能影响和缺点
临时表没有索引。不支持物化视图。
有些情况视图不可以被更新(包括更改联接键,视图定义使用聚合函数等)。
MySQL目前不支持触发器。
外键
为确保系统完整性的额外特性,会带来较高地效率代价,外键导致的死锁问题难以排查。如果要设计高性能系统,建议通过应用程序而不是外键来维护数据的完整性。
存储过程
存储过程和存储函数都可以接收参数然后返回值,触发器和事件却不行。可以节省很多网络开销,也可以操纵一些没有权限的表,但是bug较多,使用时要慎重考虑。
绑定变量
对于大量重复类型的查询语句,性能会有很大的提升。一般来说,利大于弊,使用还能保证一定的安全性。优点
在服务器端只需要解析一次SQL语句。某些优化器的工作只需要执行一次。
以二进制方式只发送参数和句柄,比起每次都发送ASCII码文本效率更高。
代码样例
public boolean insert(User user){ boolean flag=true; Connection conn=null; PreparedStatement ps=null; String sql="update user set pwd=? where name=?"; conn=DBConnUtil.getConn(); try { ps=conn.prepareStatement(sql); ps.setString(1, user.getPwd()); ps.setString(2, user.getName()); int i= ps.executeUpdate(); if(i==0){ flag=false; } } catch (SQLException e) { e.printStackTrace(); }finally{ DBConnUtil.closeAll(null, ps, conn); } return flag; }
插件
用C或C++编写插件来扩展MySQL的功能,极客所为。字符集
数据库,表间的字符集最好统一,但是是否使用UTF-8看情况而定。全文索引
最好使用Lucene、Sphinx来解决全文索引问题。XA事务
除非真正明白XA事务,否则不要轻易更改默认配置。查询缓存
真正需要查询缓存时才使用,否则不要使用。使用时不要设置太大的缓存内存。如果希望有更高的缓存效率,最好在应用程序提供缓存。
适用条件
UPDATE、DELETE和INSERT操作相比SELECT来说非常少时。被缓存的查询本身消耗巨大,即使缓存命中率非常低,也仍然会对系统性能提升有好处。
0x04小结
以上的高级特性都不是万能药,使用时要充分用与不用的测量,还包括考虑当前数据库的版本。引用
《高性能MySQL · 第三版》相关文章推荐
- Mondrian初涉入门(Mysql数据库,运行自带演示程序FoodMart配置步骤)
- mysql 优化实例(百万级数据)
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsExce
- Navicat for MySQL 工具注册码
- MySQL索引原理及慢查询优化
- Insert into 加锁机制
- MySQL中information_schema
- MySQL:索引工作原理
- mysql 索引和查询优化
- 一千行MySQL学习笔记
- 解压版MySQL安装图解
- MySQL学习笔记----子查询、联结表、组合查询、全文本搜索
- MySQL学习笔记----子查询、联结表、组合查询、全文本搜索
- MySQL基础 一
- mysql安装
- 一千行MySQL学习笔记
- Mysql报错注入简单测试模型 20160416
- MySQL中group by max如何提取最大的一条记录
- The user specified as a definer ('test'@'%') does not exist
- MYSQL 的错误Incorrect information in file: '.\test\stuff.frm