MySQL:记录数多(数据量大)时可能引起的问题

The total number of locks exceeds the lock table size.

 

感觉innodb引擎的表读取速度不如myisam…

于是我要把innodb的数据全部导入myisam的表。

 

insert into t_data_myisam (select * from t_data_innodb);

 

运行了一段时间以后,数据库报错:The total number of locks exceeds the lock table size。

我以为是myisam的表报错了,但百度说,需要调整InnoDB全局的innodb_buffer_pool_size的值。

 

show variables like "%_buffer%"

MySQL:记录数多(数据量大)时可能引起的问题_第1张图片

SET GLOBAL innodb_buffer_pool_size = 4*1024*1024*1024;  # (4 GB)

 

参考一篇很详细的文章:innodb: 设置最佳内存值

InnoDB缓冲池实际上用于多个目的,它用来:
* 数据缓存 – 这绝对是它的最重要的目的
* 索引缓存 – 这使用是的同一个缓冲池
* 缓冲 – 更改的数据(通常称为脏数据)在被刷新到硬盘之前先存放到缓冲
* 存储内部结构 – 一些结构如自适应哈希索引或者行锁也都存储在InnoDB缓冲池

 

SELECT ENGINE,
  COUNT(*) AS TABLES,
  CONCAT(ROUND(SUM(table_rows)/1000000,2),'M') ROWS,
  CONCAT(ROUND(SUM(data_length)/(1024*1024*1024),2),'G') DATA,
  CONCAT(ROUND(SUM(index_length)/(1024*1024*1024),2),'G') idx,
  CONCAT(ROUND(SUM(data_length+index_length)/(1024*1024*1024),2),'G') total_size,
  ROUND(SUM(index_length)/SUM(data_length),2) idxfrac
FROM information_schema.TABLES
WHERE table_schema = 'db_mkt'
GROUP BY ENGINE
ORDER BY SUM(data_length+index_length) DESC LIMIT 10;

你可能感兴趣的:(数据库)