主页 >> 数据库 > Mysql数据库优化

2013/03/31 | 星期日 分类:数据库 | 没有评论 标签: , | 作者: | 1,545 views

Mysql数据库优化

Mysql数据库优化,对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要!从以下几个方面了解读:恰当的硬件资源、数据库设计、sql语句优化、数据库参数配置

A.合理的硬件资源,Mysql读写分离,数据库集群
2. 如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散。主库master用来写入,slave1—slaveN都用来做select,每个数据库分担的压力小了很多。.
3.利用中间层(中间件)来实现这个代理,对程序来读写哪些数据库是透明的。比如官方有个mysql-proxy。或者使用新浪的amobe for mysql,也可达到这个目的,结构流程图如下 Master_slave

B.数据库设计

1.三范式与适当的数据冗余,已达到高查询效率的目的。

2.适当的建立索引:普通索引INDEX,唯一索引UNIQUE INDEX,主键索引PRIMARY KEY(属于唯一索引一种),全文索引FULLTEXT;另外索引可以是(单列索引与多列索引),还可以对长字段支持前缀索引。
a.选择适当的字段类型,特别是主键
b.效率问题:选择字段的一般原则是保小不保大,能用占用字节小的字段就不用大字段。比如主键用自增类型!
c.外键表示清楚,方便建立索引.
d.Example:datetime和timestamp,datetime占用8个字节,而timestamp占用4 个字节,只用了一半,而timestamp表示的范围是1970—2037,对于大多数应用,尤其是记录什么考试时间,登录时间这类信息,绰绰有余。.

3.对表进行水平划分:单表记录超过千万条时考虑对表水平切分:划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。

4.对表进行垂直划分:记录不多,但占用空间大的表,对字段长占空间大的数据拆分出来,比如:表中的text字段分拆,减少检索表时执行I/O以提高性能,分拆表与原表是一对一的关系。

5.文件、图片等大文件用文件系统存储,不用数据库,Mysql数据库只存储图片路径。

6.掌握表的写入时机,宁可集中批量操作,避免频繁读写:Example 文章访问数据统计,要求不是实时更新的情况下,可以夜深人静的时候批量处理。

7.选择合适的引擎:Mysql提供了很多种引擎,用得最多的是myisam,innodb,memory这三类。

C.SQL语句优化

1.Sql语句优化工具
a.慢日志
如果发现系统慢了,又说不清楚是哪里慢,那么就该用这个工具了。只需要为mysql配置参数,mysql会自己记录下来慢的sql语句。配置很简单,参数文件里配置:
slow_query_log=d:/slow.txt
long_query_time = 2
就可以在d:/slow.txt里找到执行时间超过2秒的语句了。

b.mysqldumpslow.pl
慢日志文件可能会很大,让人去看是很难受的事。这时候我们可以通过mysql自带的工具来分析。这个工具可以格式化慢日志文件,对于只是参数不同的语句 会归类类并,比如有两个语句select * from a where id=1 和select * from a where id=2,经过这个工具整理后就只剩下select * from a where id=N,这样读起来就舒服多了。而且这个工具可以实现简单的排序,让我们有的放矢。
2.Explain 很强大,SQL分析.
a.用explain可以看到mysql执行计划,详情请查手册。
b.借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。
3. 如果什么都做不了,试试全索引扫描

D.Mysql数据库参数配置
1.innodb_additional_mem_pool_size
2.innodb_buffer_pool_size
3.myisam,需要调整key_buffer_size
当然调整参数还是要看状态,用show status语句可以看到当前状态,以决定改调整哪些参数
Cretated_tmp_disk_tables 增加tmp_table_size
Handler_read_key 高表示索引正确 Handler_read_rnd高表示索引不正确
Key_reads/Key_read_requests 应小于0.01 计算缓存损失率,增加Key_buffer_size
Opentables/Open_tables 增加table_cache
select_full_join 没有实用索引的链接的数量。如果不为0,应该检查索引。
select_range_check 如果不为0,该检查表索引。.
sort_merge_passes 排序算法已经执行的合并的数量。如果该值较大,应增加sort_buffer_size
table_locks_waited 不能立即获得的表的锁的次数,如果该值较高,应优化查询
Threads_created 创建用来处理连接的线程数。如果Threads_created较大,要增加 thread_cache_size值。
缓存访问率的计算方法Threads_created/Connections。

参考文档:http://www.cnblogs.com/villion/archive/2009/07/23/1893765.html
归档与总结,并加以消化。

  • 本文目前尚无任何评论.
    1. 本文目前尚无任何 trackbacks 和 pingbacks.