高性能MySQL读书笔记--第一章

1、如何让查询显示出正常的(key-value模式)格式

show table status like '%user%' \G

这个\G可以让数据格式按照比较好看的样式显示出来,恩。

2、关于MyISAM

表锁定,但支持select的时候inert??

修复方法:

check table user;
repair table user;

索引的时候对于text和bolb只支持前500个字符。

支持Delay key write,即主键变动不会马上写入磁盘以提升性能,因此在重启MyISAM引擎后有必要check myisam

使用myisampack工具可将MyISAM数据库进行压缩,压缩后具有更小的存放空间和性能,但是只读的。

MyISAM支持Merge Engine,将其他MyISAM表虚拟的合并到一个表中。

3、各种MySQL Engine

InnoDB主要用于“事务型”处理
InnoDB支持外键。
InnoDB支持“Raw Disk分区”直接作为数据的存储空间
使用MVCC进一步提升锁的并发性。
默认REPEATABLE READ事务隔离级别。
它使用Cluster Index,查询主键的速度非常快
非主键的索引一定会包含主键索引,因此要注意主键的大小。
InnoDB创建、修改索引的时间比MyISAM消耗的要大。
InnoDB当初是基于“低磁盘空间、单CPU、有限内存”的条件构建的,现在面临规模上拓展的难题。

Memory Engine
比MyISAM快一个数量级左右,但是重启后会丢失。
主要用于Cache,Map,中间处理结果等类似操作
表级锁定
它不同于临时表

Archive Engine
不支持索引,只支持select和insert
自动用zlib压缩,低I/O消耗
主要用途:Replication(MySQL复制集群)中的Master,因为slave可以用任意其他形式,复制的时候非常有优势。

CSV Engine
支持将csv文件格式(以;分隔,好多通讯录导出的那个玩意儿)作为数据库。。
一般用于MySQL和其他支持csv格式程序的数据交换。

The Federated Engine
目前仍在实验中,一般用于Hack的方式解决Rplication中遇到的问题。

The Blackhole Engine(黑洞引擎)
丢弃所有的insert操作不存储,但是仍记录下日志。。这个很搞笑
据说也是Rplication和审计日志的时候用到

NDB Engine
这个是索爱开发的(没错,就是那个索爱手机)
为高速(实时系统),冗余和负载均衡而设计。
我理解这是个分布式数据库引擎:
每个Node上存放若干Segment的数据(可冗余,多份copy),对上面是透明的。
据说这个引擎非常NB,但是不是一般应用可以用的,光搞清楚配置就可以写好几本书……我觉得Apache下的按个Ca什么应该更适用于实际一点。

The Falcon Engine
Jim Starkey(MVCC的发明者)开发的引擎,2006年刚引入MySQL,非常年轻。主要是事务操作全部在内存中执行因此commit和rollback比较快。

The solidDB Engine
SolidDB公司开发的引擎,很多特性与InnoDB类似。

4、如何选择合适的MySQL Engine

以下依据仅是一些参考因素:

事务:业务是否需要支持事务,如果需要InnoDB是最好的选择,否则MyISAM

并发:如果只是少量的insert和select,MyISAM是最好的选择。

备份:如果业务不允许离线备份(挺掉MySQL直接拷贝),请参考11章。

故障恢复:InnoDB的故障恢复速度远快于MyISAM

cluster index:InnoDB或solidDB

全文索引:MyISAM

5、从业务场景出发选择Engine

Logging:高insert速度,MyISAM、Archive。如果需要进行大量在线分析,可用Rplication,在slave上read操作。或者对Table切割(Merge Table),缩小出冲突区域然后再进行分析。

只读或读操作占多:MyISAM,但是崩溃后恢复起来会很慢。

处理订单:一般需要事务支持,InnoDB是首选

股票数据处理:如果数据已经收集完毕,MyISAM。如果需要并发地读和写,行级锁定的引擎是好的选择。

BBS:每个Request都需要好多个query(select,insert、update等)来支持。特别需要注意一些特殊SQL语句:

mysql> SELECT COUNT(*) FROM table;

不是每个Engine都能快速的完成这个查询,MyISAM可以,但是其他很多都不行。对于每种引擎,都有一些这样的“语句速度Bug”。

基于CD-ROM或DVD的程序:使用MyISAM或者压缩的MyISAM,特别是后者,因为占用空间小,而且CD/DVD本来就是只读的。

6、改变表的引擎

方法1:

mysql >> alter table mytable engine = InnoDB;

警告:MySQL默认采用row-by-row的拷贝,这可能会导致严重的I/O性能下降。

方法2:

也可以通过mysqldump导入,然后mysq再导入,只需修改create中的引擎即可。

方法3:

mysql >> create table test_innodb like test; //只复制结构

mysql >> alter test_innodb engine = innodb; //修改引擎

mysql >> insert into test_innodb select * from test; //快速的插入

但是万一有失败的话会非常麻烦,因此不如采用事务的方式:

mysql >> START TRANSACTION;
mysql >> INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
mysql >> COMMIT;

如果修改过程中不希望有新数据捣乱,可以直接Lock Table.

Leave a Reply

Your email address will not be published. Required fields are marked *