mysql优化
2016-07-07 14:27
435 查看
对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要。一般来说要保证数据库的性能要保证以下四方面的工作:数据库设计,sql语句优化,数据库参数配置,恰当的硬件资源和操作系统,这个顺序也表现了这四个工作对性能影响的大小。
为什么要进行mysql优化:
假设我们设置一个数据量超过10万条记录的表,来进行我们经常做的查询操作比如:select * from 表名,服务器很慢甚至卡死,需要我们重启数据库服务器,这说明我们的表或者查询SQL是有问题的,所以我们要进行mysql优化
数据库优化的目的?
通过各种对数据的优化方法,获取最高的查询和加载性能,达到查询性能的提高和加载性能的提高;
方式和途径:
建表,索引,配置,sql语句都需要优化;
mysql运行原理
1. 查询缓存,判断sql语句是否完全匹配,再判断是否有权限,两个判断为假则到解析器解析语句,为真则提取数据结果返回给用户。
2. 解析器解析。解析器先词法分析,语法分析,检查错误比如引号有没闭合等,然后生成解析树。
3. 预处理。预处理解决解析器无法决解的语义,如检查表和列是否存在,别名是否有错,生成新的解析树。
4. 优化器做大量的优化操作。
5. 生成执行计划。
6. 查询执行引擎,负责调度引擎获取相应数据
7. 返回结果。
为什么要分表?
数据库中的数据量不一定是可控的,在未进行分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
什么是分表?
原本存储于一个表的数据分块存储到多个表上;
对表进行水平划分
如果一个表的记录数太多了,比如上千万条,而且 需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这需要数据在逻辑上可以划分。一个好的划分依据,有 利于程序的简单实现,也可以充分利用水平分表的优势。比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了。如果 非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了。所以一个好的拆分依据是最重要的。
对表进行垂直划分
有些表记录数并不多,可能也就2、3万条,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。这个时候需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
为什么要进行mysql优化:
假设我们设置一个数据量超过10万条记录的表,来进行我们经常做的查询操作比如:select * from 表名,服务器很慢甚至卡死,需要我们重启数据库服务器,这说明我们的表或者查询SQL是有问题的,所以我们要进行mysql优化
数据库优化的目的?
通过各种对数据的优化方法,获取最高的查询和加载性能,达到查询性能的提高和加载性能的提高;
方式和途径:
建表,索引,配置,sql语句都需要优化;
mysql运行原理
1. 查询缓存,判断sql语句是否完全匹配,再判断是否有权限,两个判断为假则到解析器解析语句,为真则提取数据结果返回给用户。
2. 解析器解析。解析器先词法分析,语法分析,检查错误比如引号有没闭合等,然后生成解析树。
3. 预处理。预处理解决解析器无法决解的语义,如检查表和列是否存在,别名是否有错,生成新的解析树。
4. 优化器做大量的优化操作。
5. 生成执行计划。
6. 查询执行引擎,负责调度引擎获取相应数据
7. 返回结果。
为什么要分表?
数据库中的数据量不一定是可控的,在未进行分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
什么是分表?
原本存储于一个表的数据分块存储到多个表上;
对表进行水平划分
如果一个表的记录数太多了,比如上千万条,而且 需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这需要数据在逻辑上可以划分。一个好的划分依据,有 利于程序的简单实现,也可以充分利用水平分表的优势。比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了。如果 非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了。所以一个好的拆分依据是最重要的。
对表进行垂直划分
有些表记录数并不多,可能也就2、3万条,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。这个时候需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
相关文章推荐
- MySQL数据库占用的空间、表记录的行数
- MySQL修改主键属性
- mysql随机从数据库查询数据
- MySQL开发中常用的查询语句总结
- mybatis-paginator+mysql 简单案例
- mysql源码rmp包的安装步骤
- MYSQL数据库字段字符集查看修改
- MySQL索引原理及慢查询优化
- 远程登录服务器上的mysql,报错:2003 10061
- Mysql体系结构详解——后台线程(待更新)
- Mysql Innodb小结
- debian下mysql如何远程连接
- mysql数据库root密码忘记的修改
- valgrind 生成mysqld调用图之 select now()跟踪
- mysql编码问题
- Pyhton 操作MySQL数据库
- MySQL 5.7 双主复制+keepalived,常规业务一般够用了
- 转换MYSQL建表语句转换H2建表语句工具
- mysql 10038错误
- MySQL数据库 主主、主从同步配置及原理