文档章节

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

JoshuaShaw
 JoshuaShaw
发布于 2016/04/22 15:09
字数 1327
阅读 206
收藏 11

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 · 第三版》

© 著作权归作者所有

JoshuaShaw
粉丝 5
博文 27
码字总数 15604
作品 0
湛江
程序员
私信 提问
《高性能MySQL》の复制

---title: 《高性能MySQL》の复制date: 2016-04-26 19:19:20categories: 计算机科学tags: 关系型数据库 MySQL --- 0x00前言 本书讲述到定稿前的MySQL5.5版,所以下面内容的适用范围止步于MyS...

JoshuaShaw
2016/04/26
103
0
Eova 1.5.1 Oracle 兼容,Java Web 快速开发平台

主要兼容Oracle,Mysql用户自行判定是否有更新必要! 兼容Oracle,提供Oracle完整脚本、配置,可直接运行! [新增]可在界面直接配置多子表 [新增]排除不需要登录拦截的URL [修复]图片上传无法...

Jieven
2016/02/16
3.9K
14
和某游戏猎头的对话

HI。 游戏猎头徐磊 16:00:34 请教你一个问题。。现在方便不? 午后の咖啡 16:00:45 在 游戏猎头徐磊 16:01:07 研发 高级软件工程师 项目描述:3D模拟经营网络游戏人生OL 开发工具:VS2005, F...

付翔
2010/04/07
0
0
火影忍者番外篇-Eova隐藏技能

用通俗的语言,娱乐的心态,茶余饭后的时间,来掌握晦涩的技术,Eova不仅要开发So Easy,还要学习So Easy! 希望《火影忍者番外篇-Eova隐藏技能》系列博文能为Eova用户,拨开迷雾! 卡卡西:...

Jieven
2016/01/27
2.4K
10
阿里云文件存储的高性能架构演进之路

10月27日下午,2018中国计算机大会上举办了主题“数据中心计算”的技术论坛,一起探讨解决数据中心所面临的挑战。论坛上,阿里云分布式存储团队高级技术专家田磊磊进行了《阿里云文件存储的高...

阿里云云栖社区
2018/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

任务调度-Spring+第三方库Quartz实现分布式任务管理与调度

1. 为什么要用Spring+第三方库Quartz来实现分布式任务管理和调度? 首先管理的目的是通过集群多节点的管理提供容错,调度的目的是保证同一任务只会被完整执行一次;之前分享过的任务调度-单体...

秋日芒草
1分钟前
0
0
Mysql Explain Type

前言 当我们执行sql,一般都会用Explain来查看sql的效率如何。今天在看sql执行效率的时候,忘记了其中Type的意思,现在在此记录一下。 效率 这里的type指的是访问类型,各个效率高低如下: ...

无敌小杰杰
9分钟前
0
0
外部浏览器网页复制公众号无法自动唤起微信并关注怎么办?

现在有很多用户在外部浏览器网页复制公众号时无法自动唤起微信并关注,这是因为第三方浏览器打开微信的接口,微信只给部分合作平台开放了接口权限,任何第三方想调用只能是通过一些技术手段来...

qjniop
13分钟前
0
0
建造者模式

建造者模式(Builder Pattern) 也叫生成器模式,其定义如下: Separate the construction of a complex object from its representation so that the same construction process can create d......

无知的小狼
18分钟前
0
0
距离计算方法

1、欧式距离(欧几里得距离) 欧式距离是最易理解的距离定义,即各坐标点的坐标之差的平方和相加,然后开根号。 二维平面上点 与点 之间的距离公式是: n维空间上点 和点 之间的距离公式是:...

城北徐公美
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部