现在的位置: 首页 > 综合 > 正文

MySQL 数据库性能优化

2013年09月19日 ⁄ 综合 ⁄ 共 1577字 ⁄ 字号 评论关闭

 

 

for&ever 2009-08-24

性能优化,很大部分是查询时候速度的优化,也就是查询的时候,如何在最短的时间获取查询结果,同时占用最少的系统资源。

 

1、数据库设计部分:

处理速度(一般性比较):

数值类型 >>> 文本类型

固定文本类型 > 可变文本类型(有时候)

短文本类型 > 长文本类型

 

1> 选取最适用的字段属性

表越小,在它上面执行查询得到结果越快。

在设计表格时,应将表中字段的宽度设置的尽可能短小。

 

2> 尽量把字段的值设置为 NOT NULL

执行查询时,数据库不用比较NULL

 

3> 某些文本字段, 可以定义为ENUM类型

MySQL中,ENUM类型被当作数值型数据来处理

 

4> 合理使用索引

索引的目的就是为了提高查询效率.但是使用要恰到好处,也不可滥用。

 

在以下情形下:

4.1>   某一字段经常进行连接,但没有指定为外键,则在该列上建立索引,其他的不经常连接字段,由优化器自动生成索引

 

4.2>  某一字段需要频繁进行分组(group by)或排序(order by)操作,则在该列上建立索引

 

4.3>  某一字段经常作为查询条件,如果该列的数据,不同数据值很多,则在该列上建立索引

 

4.4>  某几个字段经常一起使用来作为排序手段,则在几个列建立复合索引

 

4.5>  数据库表数据大量更新,则手动删除原来的索引,并重建。

 

4.6> 对一些 CHAR/VARCHAR 列创建索引,只索引该列的某部分前缀可以节省很多存储空间

 

5> 需要在不同的表不同的列保存相同信息,尽量使这些列有同样的定义和相同的列名

 

6> 定长格式的列比动态长度格式的列更快,更安全

 

 

2、数据库查询语句部分:

 

1> 尽量避免类似 SELECT * FROM table 这样的 * 的使用

按需获取,不要查询应用中不需要的列。

 

2> 尽可能的使用连接查询来代替子查询

子查询一般需要在内存中创建临时表,连接查询则不需要。

现实中,一般的,一步到位比拐弯抹角要快。

如果子查询不可避免,在子查询中过滤掉尽可能多的行

 

3> 多个相同查询语句结果的组合,尽可能使用联合查询(UNION),而不采用手动创建临时表

道理同上。

 

4> 当不得不用事务时,优先考虑锁定表的方式。

对于大数据量多用户的访问环境,锁定表比使用事务,可以获得更快的用户响应。

 

5> 对于一些多表级联删除操作,为了避开事务,应尽可能设置外键。

注意: 要使用外键,一定要先设置表的类型为 InnoDB

 

6> 合理的使用临时表

与上面的 2 进行比较。

如果某个查询,需要被执行多次而不止一次,应考虑临时表

 

7> 大规模的计算,尽量在DB外部操作

 

8> 如果表很大,且需要做一个汇总之类的查询操作,尽量不每次都直接分组(group by)查询,考虑创建一个表作为汇总。

 

9> 有时候,记录全部删除,然后再插入要比部分删除再插入记录要快。

尤其是总数据很多的时候。

 

 

3、数据库设置部分

 

1> 适当的调大 tmp_table_size 的值

尤其是当系统某查询表格的数据量很大(例如10W数据)的时候,

 

2> 设置 skip-locking 开启,避免MySQL的外部锁定,减少出错几率增强稳定性

 

3> 设置 skip-name-resolve 开启,禁用 MySQL 外部连接时的DNS解析

 

4> 设置适当的 key_buffer_size 的值。

索引的缓冲区大小,适当的设置该值,可得到更好的索引处理性能。

一般 200 - 500 M,根据具体的物理内存调整。

 

5> 如果使用的数据库类型是 Innodb,试着修改 innodb_flush_logs_at_trx_commit 的值,如0 2

 

6> 如果 Client Server 在同一台机器,连接数据库时,不要用IP方式,而优先使用localhost的链接方式。

 

SQL优化方面,比较好的书,《the art of SQL.

 

@forandever for&ever 2009-08-24

 

MySQL 数据库性能优化

抱歉!评论已关闭.