您的位置:首页 > 数据库 > MySQL

《高性能MySQL》のMySQL高级特性

2016-04-22 00:00 573 查看
摘要: 本书讲述到定稿前的MySQL5.5版,所以下面内容的适用范围止步于MySQL5.5。本文仅仅强调书中讲述的重中之重,
以便快速查阅,详细的内容还请认真阅读书本和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 · 第三版》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: