mysql的性能优化简介
mysql性能下降的原因
- sql语句本身有问题,或没建索引
- 索引失效,索引失效的原因本文后面会叙述
- 关联了过多的表,可能是前期设计缺陷,或者太奇葩的需求
- 服务器调优及参数设置,例如缓冲、线程等
mysql多表连接查询的模式
1. 左表和右表的共有部分,即内连接
SELECT fileds
FROM TableA AS A
INNER JOIN TableB AS B
ON A.key1 = B.key2;
2. 左表和右表的共有部分+左表的全部,即左连接
SELECT fileds
FROM TableA AS A
LEFT JOIN TableB AS B
ON A.key1 = B.key2;
3. 左表和右表的共有部分+右表的全部,即右连接
SELECT fileds
FROM TableA AS A
RIGHT JOIN TableB AS B
ON A.key1 = B.key2;
4. 左表独有的部分
SELECT fileds
FROM TableA AS A
LEFT JOIN TableB AS B
ON A.key1 = B.key2
WHERE B.key2 IS NULL;
5. 右表独有的部分
SELECT fields
FROM TableA AS A
RIGHT JOIN TableB AS B
ON A.key1 = B.key2
WHERE A.key1 IS NULL;
6. 左表的全部+右表的全部
mysql不支持full outer join,只能用union来实现
SELECT fields
FROM TableA AS A
LEFT JOIN TableB AS B
ON A.key1 = B.key2
UNION
SELECT fields
FROM TableA AS A
RIGHT JOIN TableB AS B
ON A.key1 = B.key2;
7. 左表独有的部分+右表独有的部分,即内连接的补集
SELECT fields
FROM TableA AS A
LEFT JOIN TableB AS B
ON A.key1 = B.key2
WHERE B.key2 IS NULL
UNION
SELECT fields
FROM TableA AS A
RIGHT JOIN TableB AS B
ON A.key1 = B.key2
WHERE A.key1 IS NULL;
索引
1. 索引的概念
官方定义:索引是帮助mysql高效获取数据的数据结构。划重点:数据结构。在数据之外,数据库系统还维护了一套满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这种数据结构就是索引,可以简单的理解为"排好序的快速查找数据结构"。索引本身也很大,不可能全部存储在内存,通常以索引文件的形式存储在磁盘中。
2. 索引按结构分类及其检索原理
- BTree索引
- Hash索引
- full-text全文索引
- R-Tree索引
一般Java开发工程师用到的是BTree索引,或者称为B树索引,其检索原理如下图所示
如果要查找数字93,在第一层判断93<100,因此找左边的指针;在第二层判断93>80,因此找右边的指针;在第三层的磁盘块中找到了存储的93。B树索引的纵向层次决定了一次检索需要几次IO,因此纵向层次越少,性能越优。一般三层B树可以处理100万数据,如果不使用索引,可能需要几万到几十万次IO,但使用索引只需要3次。
3. 索引按字段分类
- 单值索引:索引只包含1个列,一个表可以建多个单值索引
- 复合索引:索引包含多个列
- 唯一索引:索引列的值必须是唯一的,但允许有空值
4. 新建索引
CREATE [UNIQUE] INDEX indexName ON tableName(columnName);
ALTER TABLE tableName ADD [UNIQUE] INDEX indexName (columnName);
以上两个语句都可以用于新建索引。其中,indexName是索引名称,tableName是表名,columnName是列名,如果是多列索引中间用逗号分隔,如果新建的是唯一索引,需要加UNIQUE。
5. 删除索引
DROP INDEX indexName ON tableName;
其中,indexName是索引名称,tableName是表名,表示删除指定表的指定索引。
6. 查看索引
SHOW INDEX FROM tableName\G
其中,tableName是表名,\G是为了显示格式优化。
7. 索引的优势
- 提高数据检索效率,降低数据库的IO成本
- 通过索引对数据进行排序,降低CPU消耗
因此,索引有两个功能,分别作用在WHERE字句和ORDER BY子句上。
8. 索引可能引起的问题
- 索引也是一张表,保存了主键和索引字段,并指向实体表的记录
- 索引提高了读表速度,却降低了写表的速度,因为在进行INSER、DELETE、UPDATE操作时,不仅要保存数据,还要保存因更新表带来的索引信息变化
索引并不是随便加,也不是越多越好,过多的或者不恰当的索引,反而会降低数据库的效率,一般一个表不应超过5个索引。
9. 适合建索引的情况
- 主键自动建立唯一索引
- 连表查询时,对外连接的字段
- 频繁用作查询条件的字段,即WHERE filedName = 'xxx'
- 需要排序的字段,即ORDER BY fieldName
10. 不适合建索引的情况
- 频繁更新的字段,因为每次更新都需要更新索引信息
- WHERE子句里极少用到的字段
- 表记录数量太少,一般低于百万数据的表,建索引意义不大,超过300万性能才开始下降
- 数据大量重复且平均分布的字段,建索引意义不大,例如一个字段表示性别,值不是男就是女,且出现的概率差不多,就没有必要建索引。
关于最后一条,涉及一个概念:索引的选择性。索引的选择性是指一个字段的不同的值的数量跟表的记录数的比值,例如一个字段可能存在8888个值,这个表共有10000条记录,那么在这个字段上建的索引的选择性就是0.8888。索引选择性越接近1,它的效率就越高。上面提到的"性别"字段,可能存在的值只有2个,如果这个表有10000条记录,那么如果在这个字段上建索引,它的选择性只有0.0002。
mysql的性能优化简介的更多相关文章
- 1229【MySQL】性能优化之 Index Condition Pushdown
转自http://blog.itpub.net/22664653/viewspace-1210844/ [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...
- 深入理解MySQL开发性能优化.pptx
深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
- MySQL数据库性能优化的关键参数(转)
我们在进行数据库管理和开发中经常会遇到性能问题,这就涉及到MySQL的性能优化.通过在网络上查找资料和笔者自己的尝试,我认为以下系统参数是比较关键的: 关键参数一:back_log 要求 MySQL ...
- MySQL 数据库性能优化之索引优化
接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...
- 从数据库、代码和服务器对PHP网站Mysql做性能优化
数据库优化是PHP面试几乎都会被问到的事情,也是我们工作中应该注意的事情,当然,如果是小网站无所谓优化不优化,网站访问量大了自然会暴漏数据库的瓶颈,这个瓶颈是各方面问题综合导致的,下面我们来做下数据库 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- Mysql数据库性能优化(一)
参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...
- LeakCanary 内存泄漏 监测 性能优化 简介 原理 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 修改mysql的binlog的位置
最近项目上装的mysql服务,分配的磁盘空间太小了,导致binlog两天时间就能打满,这里记录下处理方式 mysql的binlog日志是一个很重要的日志,以事件形式记录了所有的DDL和DML(除了数据 ...
- Linux SUID SGID SBIT 简介和权限设定
SUID :Set UID 1 SUID 权限仅对二进制程序(binary program)有效 2 执行者对于该程序需要具有x的可执行权限 3 本权限仅在执行该程序的过程中有效(run-time) ...
- C# 文件操作的一些小点子
1. 判断指定文件是否存在: bool System.IO.File.Exits(string fliePath);
- 微信小程序 canIUse
wx.canIUse(); 微信文档中定义在API中,可以理解为一个函数. 返回值: true 或者 false 示例: // 在JS文件的函数中进行使用 console.log(wx.canIUse ...
- Linux perf命令详解及常用参数解析
perf 相关命令:暂无相关命令 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找. Perf List利用perf剖析程序性能时,需要指定当前测试的性能时间.性能事件是指在 ...
- Gym - 102040B Counting Inversion (数位dp)
题意:求[a,b]区间内的数字中正序对的个数. 具体思路参考: https://blog.csdn.net/weixin_43135318/article/details/88061396 https ...
- 我说CMMI之六:CMMI的评估--转载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...
- c#图像处理的简单算法
原文链接:https://blog.csdn.net/wchstrife/article/details/78984735 使用C#进行图像处理前言之前一直认为图像处理是一件很高大上的事情,在一门选修 ...
- JavaScript 正则表达式——对象,修饰符,元字符,字符类,范围类
㈠RegExp 对象 ⑴JavaScript通过内置对象RegExp支持正则表达式 ⑵有两种方法实例化RegExp对象 ①字面量 ②构造函数 ⑶字面量示例 示例1: 你会发 ...
- Java多线程和并发(十),JMM(Java内存模型)
目录 1.什么是JMM 2.JMM的主内存和工作内存 3.JMM如何解决可见性问题-指令重排序 4.Volatile 十.JMM(Java内存模型)(暂时没有理解) 1.什么是JMM 2.JMM的主内 ...