我正在开发一个数据库,它是一个非常大的数据库,拥有13亿行和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语句的复杂查询。
答案 0 :(得分:7)
一种常见的做法是,如果您拥有大量数据,那么......
SELECT *
:您应该只选择所需的列答案 1 :(得分:1)
许多数据库管理员面临的常见问题。解决方案:缓存。
将查询分解为更简单和更小的查询。使用 Memcached 或其他缓存技术和工具Memcached保存关键的vaue对,检查memcache中的数据..如果可用,请使用它。如果没有从数据库中获取它,然后使用和cach。接下来可以从cahe获得数据。
您必须开发自己的逻辑并更改一些查询。 Memcached可以在这里找到:
网上提供了许多教程
答案 2 :(得分:1)
在my.conf中启用慢达N秒的查询,然后执行一些查询并查看此日志,这会为您提供一些线索,也许您可以在此表中添加一些索引。 / p>
或使用EXPLAIN进行一些查询。 http://hackmysql.com/case1
答案 3 :(得分:0)
快速记录通常很容易获胜...
如果您有任何大型文本blob列,请尝试选择除这些字段之外的所有内容。我见过varchar(max)字段绝对会破坏查询效率。
答案 4 :(得分:0)
您有一个非常宽的平均行大小和35列。您可以尝试对表进行垂直分区,即将表拆分为较小的表,这些表以1:1的方式与表中的列子集相关。 InnoDB在页面中存储行,对于非常宽的行来说效率不高。
如果数据仅附加,请考虑查看ICE。
您也可以查看TokuDB,因为它支持良好的压缩。
您可以考虑使用分区和Shard-Query(http://code.google.com/p/shard-query)来并行访问数据。您还可以使用Shard-Query在多个服务器上拆分数据以实现并行性。
答案 5 :(得分:-2)
尝试添加WHERE子句: WHERE 1 = 1 如果它没有产生任何影响,那么您应该将引擎类型更改为 MyISAM 。