分类: Mysql/postgreSQL
2009-10-22 09:32:14
对长期频繁操作的表,经常会出现show index from xxx出现非正常NULL
加参数就会自动去修复了
myisam_repair_threads = 1
myisam-recover=BACKUP
我自己做了一个实验,对一个记录时间戳的表进行myisam和innodb引擎变更的数据消耗比对
myisam引擎下数据消耗是
Avg_row_length: 28
Data_length: 12927712
Index_length: 12681216
innodb引擎下数据消耗是
Avg_row_length: 51
Data_length: 23642112
Index_length: 33161216
差不多innodb的比myisam引擎的磁盘消耗翻了(23642112+33161216)/(12927712
+12681216)约2倍。
如果在小项目情况下,这些数据量不算什么,但是对于百亿级的mic项目的话,恐怕就不能忽视的,
一般300G*6磁盘raid10之后大概是800G的数据量,如果用myisam可以支撑2个实例
(按每个实例300G来算)。
innodb的话,大概会要多支出2倍的服务器成本。
附实验例子:
mysql> flush table heart_beat;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table heart_beat;
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| heart_beat | CREATE TABLE `heart_beat` (
`id` mediumint(9) NOT NULL auto_increment,
`status` varchar(10) NOT NULL default '',
`time` varchar(15) default NULL,
KEY `id` (`id`),
KEY `idx` (`time`),
KEY `idx2` (`status`,`time`)
) ENGINE=MyISAM AUTO_INCREMENT=461705 DEFAULT CHARSET=latin1 |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show table status like 'heart_beat'\G
*************************** 1. row ***************************
Name: heart_beat
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 461704
Avg_row_length: 28
Data_length: 12927712
Max_data_length: 281474976710655
Index_length: 12681216
Data_free: 0
Auto_increment: 461705
Create_time: 2008-12-22 17:13:18
Update_time: 2008-12-22 17:13:19
Check_time: 2008-12-22 17:13:21
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
mysql> alter table heart_beat engine=innodb;
Query OK, 461704 rows affected (7.90 sec)
Records: 461704 Duplicates: 0 Warnings: 0
mysql> show table status like 'heart_beat'\G
*************************** 1. row ***************************
Name: heart_beat
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 462060
Avg_row_length: 51
Data_length: 23642112
Max_data_length: 0
Index_length: 33161216
Data_free: 0
Auto_increment: 461705
Create_time: 2008-12-22 17:14:07
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment: InnoDB free: 6144 kB
1 row in set (0.00 sec)
4.1.1.5 Clustered and secondary indexes
聚集索引(clustered index)将主键和记录直接挂钩,而且记录是根据主键来排
序的。当你通过主键来查询数据的时候,聚集索引非常快。因为它只要一次查询就
可以得到结果,而标准的MyISAM的索引需要两次查询,先查到索引,然后通过索引
得到的位置再去查数据。
4.1.1.6 Unique indexes versus primary keys
主键其实就是一种不能包括数值NULL的唯一索引。主键对于MyISAM引擎不是必需
的,但对于InnoDB 和BDB引擎来讲是必需的,如果你不声明,他们会隐含添加一个主键
但是对于一个16G内存的Dell 2950的机器上跑一个300G实例,同时每个表都是活跃
表的情况下,innodb的聚集索引消耗内存是非常大的,索引消耗会大于100G,内存
肯定是无法装得下的,会产生非常巨大的磁盘IO,不断对物理磁盘索引和内存索引的换入
换出。当然myisam同样也有换入换出问题,但是至少能比innodb支撑的久一些,因为
innodb的表索引至少比myisam的表索引大了2倍。
6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
有无具体的数据来支撑这个观点呢?
innodb基于索引的update操作比MyIsam优秀了不止一点,这个不会仅仅通过分库分表就能赶上的.互娱所有游戏产品,产生的操作大部分是update,而据我了解基本上99%都选择了innodb.这足以说明问题.
如果基于读操作远大于写操作的应用,比如网站,那么用myisam还是可以的.也是不错的.但如果是写操作大于读操作的,innodb绝对是最佳选择.
另外,附上一个同事的博客.里面有几个文章,专门做了对mysql引擎方面的测试,供参考查阅.
http://rdc.taobao.com/blog/dba/html/295_insert_benchmark_for_myisam_and_innodb.html 测试表结构: 数据量:总共10个表,每个表插入400w数据 X轴是unix时间戳,Y轴是十秒钟的插入量。从以上测试结果可以看出,InnoDB的插入性能随着数据量的增多一直在下降,而且表现相当不稳定。MyISAM的表现还是比较好的,虽然瞬时插入的谷值一直在下降,但是整体表现很稳定。
CREATE TABLE `test` (
`ID` bigint(20) NOT NULL auto_increment,
`INT_A` int(11) default NULL,
`INT_B` int(11) default NULL,
`INT_C` int(11) default NULL,
`STRING_A` varchar(50) default NULL,
`STRING_B` varchar(250) default NULL,
`STRING_C` varchar(700) default NULL,
PRIMARY KEY (`ID`),
KEY `IDX_TEST_IA` (`INT_A`),
KEY `IDX_TEST_IB` (`INT_B`),
KEY `IDX_TEST_SA` (`STRING_A`,`INT_C`)
) ;
并发数:每个表并发20个线程去执行插入操作,总共200个线程
数据特点:除了主键采用自增外,索引相关字段全是随机生成的。字符串的长度和内容都是随机的,平均长度为预定义的一半
总的来说,Ext3的cache算法性能还是非常不错的,不愧是linux上面备受推崇的文件系统。InnoDB虽然提供了高可用性,但是插入性能方面的表现并不如MyISAM稳定。