MySQL性能优化
作者:andyao
原文link: http://andyao.javaeye.com/admin/show/144033
转载请留名
1. 简介
在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。
优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。
2. 数据库设计和查询优化
在MySQL Server性能调优中,首先要考虑的就是Database Schema设计,这一点是非常重要的。一个糟糕的Schema设计即使在性能调优的MySQL Server上运行,也会表现出很差的性能;和Schema相似,查询语句的设计也会影响MySQL的性能,应该避免写出低效的SQL查询。这一节将详细讨论这两方面的优化。
2.1 Schema Design
Schema的优化取决于将要运行什么样的query,不同的query会有不同的Schema优化方案。2.2节将介绍Query Design的优化。Schema设计同样受到预期数据集大小的影响。Schema设计时主要考虑:标准化,数据类型,索引。
2.1.1 标准化
标准化是在数据库中组织数据的过程。其中包括,根据设计规则创建表并在这些表间建立关系;通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并提高数据的灵活性。通常数据库标准化是让数据库设计符合某一级别的范式,通常满足第三范式即可。也有第四范式(也称为 Boyce Codd范式,BCNF))与第五范式存在,但是在实际设计中很少考虑。忽视这些规则可能使得数据库的设计不太完美,但这不应影响功能。
标准化的特点:
1) 所有的“对象”都在它自己的table中,没有冗余。
2) 数据库通常由E-R图生成。
3) 简洁,更新属性通常只需要更新很少的记录。
4) Join操作比较耗时。
5) Select,sort优化措施比较少。
6) 适用于OLTP应用。
非标准化的特点:
1) 在一张表中存储很多数据,数据冗余。
2) 更新数据开销很大,更新一个属性可能会更新很多表,很多记录。
3) 在删除数据是有可能丢失数据。
4) Select,order有很多优化的选择。
5) 适用于DSS应用。
标准化和非标准化都有各自的优缺点,通常在一个数据库设计中可以混合使用,一部分表格标准化,一部分表格保留一些冗余数据:
1) 对OLTP使用标准化,对DSS使用非标准化
2) 使用物化视图。MySQL不直接支持该数据库特性,但是可以用MyISAM
相关文档:
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。
MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。
通过索引优化来实现MySQL的ORDER BY语句优化:
1、ORDER BY的索引优化。如果一个SQL语句形如:
SELECT [column1],[column2],…. fro ......
我的程序是用ADO来连接Mysq数据库的,这是原先写好用在MSSQL上的,改了下连接字符串,所以也就没有用MySql C++ API来重新写了。刚开始使用MySql,遇到的问题总是特别的多,现在又遇到一个主要sql字符串中有中文就报错的问题,没有中文一切正常,整整弄了一个上午,在网上也找了很多资料,发 ......
1,Mysql插入二进制大对象出现异常,插入二进制出现异常,怎么解决com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
解决办法:url=url=+"?useUnicode=true& ......
下面先来看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录 ......
一.关于MySQL数据库服务器
MySQL服务器的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以UTF-8为例来说明。
1、中止MySQL服务(bin/mysqladmin -u root shutdown)
2、在/etc/下找到my.cnf,如果没有就把MySQL的安装目录下的support-files目录下的my-medium.cnf复制到/etc/下并改名为my.cnf即可
......