首页 > 数据库 > > 8.6 优化 MyIASM 表
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/optimizing-myisam.html
MyISAM存储引擎在读取主要数据或低并发性操作时表现最佳,因为表锁定限制了执行同时更新的能力。 在MySQL 5.7中,InnoDB是默认的存储引擎,而不是MyISAM。
8.6.1 优化 MyISAM 查询
加快MyISAM表查询的一些常规技巧:
参考Chapter 15, Alternative Storage Engines.
--这个有点像减少聚簇因子的感觉,但是行在某一字段顺序排序之后,其他的字段可能更无序
UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
当您使用仅具有表级锁定功能的MySQL存储引擎(多个读,而单个写)时,这一点非常重要。 这也为大多数数据库系统提供了更好的性能,因为在这种情况下行锁管理器不太容易。
----oracle 在这锁机制一点上不能不说确实很强大。
8.6.2 为MyISAM 批量加载数据
这些性能提示补充了快速插入的一般准则
如果您插入数据的MyISAM表为空,则LOAD DATA INFILE会自动执行上述优化。 自动优化和明确使用过程的主要区别在于,您可以让myisamchk为索引创建分配更多的临时内存,而不是在执行LOAD DATA INFILE语句时服务器为索引重新创建分配内存。
您还可以使用以下语句而不是myisamchk来禁用或启用MyISAM表的非唯一索引。 如果您使用这些语句,则可以跳过FLUSH TABLES操作:
ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;
LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
...
UNLOCK TABLES;
这有利于性能,因为在完成所有INSERT语句后,索引缓冲区只刷新一次。 通常情况下,INSERT语句将会有多个索引缓冲区刷新。 如果可以使用单个INSERT插入所有行,则不需要显式锁定语句。
锁定还会降低多连接测试的总时间,但个别连接的最长等待时间可能会因为等待锁定而增加。 假设五个客户端尝试同时执行插入操作,如下所示:
如果不使用锁定,则连接2,3和4会在1和5之前完成。如果使用锁定,连接2,3和4可能在1或5之前未完成,但总时间应该约为更快40%。
INSERT,UPDATE和DELETE操作在MySQL中速度非常快,但是通过在大于五次连续插入或更新的情况下添加锁,可以获得更好的整体性能。 如果你做了很多次连续的插入操作,你可以先做一个LOCK TABLES,后跟一个UNLOCK TABLES(每行大约1000行),以允许其他线程访问表。 这仍然会带来不错的性能提升。
即使在使用刚刚列出的策略时,对于加载数据,INSERT仍然比LOAD DATA INFILE慢得多。
8.6.3 repair table 语句的速度
用于MyISAM表的REPAIR TABLE类似于使用myisamchk进行修复操作,以及一些相同的性能优化应用:
假设使用以下选项设置myisamchk表修复操作来设置其内存分配变量:
--key_buffer_size=128M --myisam_sort_buffer_size=256M
--read_buffer_size=64M --write_buffer_size=64M
其中一些myisamchk变量对应于服务器系统变量:
myisamchk Variable
System Variable
key_buffer_size
myisam_sort_buffer_size
read_buffer_size
write_buffer_size
none
每个服务器系统变量都可以在运行时设置,其中一些(myisam_sort_buffer_size,read_buffer_size)除了具有全局值之外还具有会话值。设置会话值限制了更改对当前会话的影响,不会影响其他用户。更改全局变量(key_buffer_size,myisam_max_sort_file_size)也会影响其他用户。对于key_buffer_size,您必须考虑到缓冲区是与这些用户共享的。例如,如果将myisamchk key_buffer_size变量设置为128MB,则可以将相应的key_buffer_size系统变量设置为大于此值(如果它尚未设置得较大),以允许其他会话中的活动使用密钥缓冲区。但是,更改全局密钥缓冲区大小将使缓冲区无效,从而导致磁盘I / O增加以及其他会话减速。避免此问题的替代方法是使用单独的key缓存,为其分配要修复的表中的索引,并在修复完成时将其解除分配。
根据前面的说明,REPAIR TABLE操作可以按如下方式进行,以使用类似于myisamchk命令的设置。 这里分配了一个单独的128MBkey缓冲区,假定文件系统允许文件大小至少为100GB。
SET SESSION myisam_sort_buffer_size = 256*1024*1024;
SET SESSION read_buffer_size = 64*1024*1024;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
SET GLOBAL repair_cache.key_buffer_size = 128*1024*1024;
CACHE INDEX tbl_name IN repair_cache;
LOAD INDEX INTO CACHE tbl_name;
REPAIR TABLE tbl_name ;
SET GLOBAL repair_cache.key_buffer_size = 0;
如果您打算更改全局变量,但只希望在REPAIR TABLE操作期间这样做,以最小化影响其他用户,请将其值保存在用户变量中,然后再恢复。 例如:
SET @old_myisam_sort_buffer_size = @@global.myisam_max_sort_file_size;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
REPAIR TABLE tbl_name ;
SET GLOBAL myisam_max_sort_file_size = @old_myisam_max_sort_file_size;
影响REPAIR TABLE的系统变量可以在服务器启动时全局设置,如果您希望这些值在默认情况下有效。 例如,将这些行添加到服务器my.cnf文件中:
[mysqld]
myisam_sort_buffer_size=256M
key_buffer_size=1G
myisam_max_sort_file_size=100G
这些设置不包括read_buffer_size。 如果将全局read_buffer_size设置为较大值,则对于所有会话都会这样做,并且会导致性能受到多个同时会话的服务器的内存分配过多的影响。
---每个会话256M还是比较吃内存的,分析库适合。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3156670/ ,如需转载,请注明出处,否则将追究法律责任。