我的工作数据库和它的一个相当大的一个1.3十亿行约35列上。 以下是我检查表的状态后得到:
Name:Table Name
Engine:InnoDB
Version:10
Row_format:Compact
Rows:12853961
Avg_row_length:572
Data_length:7353663488
Max_data_length:0
Index_length:5877268480
Data_free:0
Auto_increment:12933138
Create_time:41271.0312615741
Update_time:NULL
Check_time:NULL
Collation:utf8_general_ci
Checksum:NULL
Create_options:
Comment:InnoDB free: 11489280 kB
我面临的,即使是单一的选择查询需要太多的时间来例如处理查询的问题Select * from Table_Name limit 0,50000
约需2.48分钟的预期是什么?
我不得不作出的报告中,我必须使用整个历史数据,也就是整个1.3亿元的行。 我可以通过批量做这批但我将不得不运行它们一次又一次花费过多时间多次查询。
当简单的查询花费如此多的时间,我不能做任何其他复杂的查询这就需要连接和case语句。
一个常见的问题许多数据库管理员面对的问题。 解决方案: 高速缓存 。
打破查询到更简单的和小的查询。 使用Memcached的或其他缓存技术和工具的Memcached保存键vaue对,检查是否有可用memcache..if数据,使用它。 如果不从数据库中获取它,然后使用和CACH。 接下来扳平数据将可从cahe。
你将不得不开发自己的逻辑和改变一些查询。 Memcached是可以在这里:
http://memcached.org/
很多教程可以在Web上
在my.conf启用慢查询多达N秒,然后执行一些查询和观看此日志,这为您提供了一些线索,也许你会有些指标在这个表格。
或做解释一些疑问。 http://hackmysql.com/case1
一个快速的注意,通常是一个轻松取胜...
如果你有一个大的文本斑点任何列,尽量选择除了那些领域的一切。 我见过VARCHAR(最大值)领域绝对杀查询效率。
你有一个非常宽的平均行大小和35列。 你可以尝试垂直分区表,也就是拆表成被彼此相关的1小表:1列从表中的一个子集。 InnoDB的行存储在页和效率不高的很宽行。
如果数据是追加,只考虑在看ICE。
你也可以看看TokuDB因为它支持良好的压缩。
您可以考虑使用分区和碎片查询( http://code.google.com/p/shard-query )并行访问数据。 您也可以在多台服务器使用碎片,并行查询拆分数据。
尝试添加WHERE子句:WHERE 1 = 1。如果它不给任何效果,那么你应该你的引擎类型更改为MyISAM数据 。
文章来源: Very big data in mysql table. Even select statements take much time