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.