mysql之优化篇(二)

二 优化数据库对象

优化表的数据类型

procedure analyse() 进行优化

select * from zip procedure analyse()\G;
*************************** 1. row ***************************
Field_name: huasheng.zip.id
Min_value: 1
Max_value: 1148
Min_length: 1
Max_length: 4
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 574.5000
Std: 331.3989
Optimal_fieldtype: SMALLINT(4) UNSIGNED NOT NULL
*************************** 2. row ***************************
Field_name: huasheng.zip.album_id
Min_value: 28
Max_value: 19360
Min_length: 2
Max_length: 5
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 10434.2822
Std: 6283.5977
Optimal_fieldtype: SMALLINT(5) UNSIGNED NOT NULL
*************************** 3. row ***************************
Field_name: huasheng.zip.path
Min_value: /data1/hs/code/run/htdocs/image/uploadimg/book/10010.zip
Max_value: /data1/hs/code/run/htdocs/image/uploadimg/book/9997.zip
Min_length: 53
Max_length: 56
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 55.4294
Std: NULL
Optimal_fieldtype: CHAR(56) NOT NULL
*************************** 4. row ***************************
Field_name: huasheng.zip.url
Min_value: http://cdnimage.vread.com/uploadimg/book/10010.zip
Max_value: http://cdnimage.vread.com/uploadimg/book/9997.zip
Min_length: 47
Max_length: 50
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 49.4294
Std: NULL
Optimal_fieldtype: CHAR(50) NOT NULL
*************************** 5. row ***************************
Field_name: huasheng.zip.book_update_time
Min_value: 1462801256
Max_value: 1521532379
Min_length: 10
Max_length: 10
Empties_or_zeros: 203
Nulls: 0
Avg_value_or_avg_length: 1228442654.0549
Std: 42226563.4963
Optimal_fieldtype: INT(10) UNSIGNED NOT NULL
*************************** 6. row ***************************
Field_name: huasheng.zip.create_time
Min_value: 1505807792
Max_value: 1521510073
Min_length: 10
Max_length: 10
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 1512561864.5113
Std: 78254463.1419
Optimal_fieldtype: INT(10) UNSIGNED NOT NULL
*************************** 7. row ***************************
Field_name: huasheng.zip.update_time
Min_value: 1505811423
Max_value: 1521594999
Min_length: 10
Max_length: 10
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 1513347832.1777
Std: 0.0000

Optimal_fieldtype: INT(10) UNSIGNED NOT NULL



通过拆分提高表的访问效率

垂直拆分 story / story_extra
        1 基本信息
  2 附加信息
水平拆分 分表
        1 表很大
2 表数据独立性
3 需要把数据放到不同的介质上

三 锁问题

mysql锁分类

1 表锁(myisam,适合读多),开销小,加锁快,不易出现死锁,锁粒度大
2 行锁(innodb,适合写多和并发高的程序),开销大,加锁慢,会出现死锁,锁粒度小

行锁优点:
1 在许多线程中访问不同的行时,只存在少量锁定冲突
2 回滚时只需要少量的更改
3 可以长时间锁定单一的行
行锁缺点:
1 比页面锁或者表锁占用更多的内存
2 大量使用/经常使用group by 操作/扫全表操作,速度慢


查看锁状态

show status like 'table%'



事务的ACID属性

原子性。要么全部执行,要么全部不执行。
一致性。事务开始和完成时数据保持一致性。
隔离性。事务不受外部并发操作影响。
持久性。当事务完成后,数据的修改是永久性的

查看innodb事务状态

show status like '%innodb%';

innodb 锁注意事项

1 不通过索引条件查询,innodb确实用的是表锁,不是行锁。
2 mysql的行锁是针对索引加的锁,而不是针对记录,使用相同的索引键可能出现冲突。
3 当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,不论是使用主键索引,唯一索引,普通索引,innodb都是采用行锁来对数据加锁
4 即使创建了索引,能偶否使用索引还是由mysql判断,如果代价高,innodb可能采用表锁

mysql 尽量减少死锁

1 尽量使用较低级别的隔离级别
2 精心设计索引并尽量使用索引反问数据,使加锁更加精确
3 合理选择事务大小
4 申请合适的事务级别
5 如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表。
6 批量处理数据时,先对数据排序,保证每个线程以固定的顺序来访问记录
7 更新记录直接使用排它锁
8 更新同一条记录可以采用READ COMMITED级别
四 优化Mysql Server

查看mysql 信息和状态

show variables;
show status;

影响mysql性能的重要参数

适用于myisam:

key_buffer_size 设置索引块缓存的大小

table_cache 数据库打开表的缓存的数量
show status like '%open_tables%'

适用于 innodb

innodb_buffer_pool_size 缓存innodb表数据和索引数据的内存缓存区的大小
innodb_flush_log_at_trx_commit
控制缓冲区中的数据写入到日志文件以及日志文件数据刷新到磁盘的操作时机。
0 每秒一次,并且刷新到磁盘
1 事务提交时,刷新到磁盘
2 提交事务时,日志缓冲写到日志文件,但是不会刷新到磁盘。对日志文件到磁盘的刷新每秒一次

innodb_addition_mem_pool_size
用来存储数据库结构和其他内部数据结构的内存池的大小,默认是1M,不够会自动分配
innodb_lock_wait_timeout
自动监控行锁导致的死锁并进行相应的处理,表锁不自动处理,默认50秒
innodb_support_xa 是否支持分布式事务
innodb_log_buffer_size 日志缓存的大小一般8-16M
innodb_log_file_size 日志组中每个日志文件的大小,默认5M, 负载越高,大点好
五 磁盘I/O问题

咱们介绍了优化sql,数据库对象优化,数据库参数优化,其实他们的目的就是优化和减少磁盘读写,因为磁盘速度实在是太慢了(相对cpu和内存)
选择合适的磁盘阵列 raid0/raid 1/raid 10/raid4/raid5
读写都很频繁,可靠性很高 raid10
读频繁,写相对较少,可靠性有一定要求 raid5
读写都很频繁,可靠性不高 raid0


猜你喜欢

转载自blog.csdn.net/u011028179/article/details/79636243