mysql表中的数据非常大。即使选择陈述也需要很长时间

时间:2012-12-28 09:50:31

标签: mysql database performance query-optimization reporting

我正在开发一个数据库,它是一个非常大的数据库,拥有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语句的复杂查询。

6 个答案:

答案 0 :(得分:7)

一种常见的做法是,如果您拥有大量数据,那么......

  1. 不应SELECT *:您应该只选择所需的列
  2. 应将您的获取范围限制为较小的数字:我打赌您不会同时处理50000条记录。尝试逐批获取。

答案 1 :(得分:1)

许多数据库管理员面临的常见问题。解决方案:缓存

将查询分解为更简单和更小的查询。使用 Memcached 或其他缓存技术和工具Memcached保存关键的vaue对,检查memcache中的数据..如果可用,请使用它。如果没有从数据库中获取它,然后使用和cach。接下来可以从cahe获得数据。

您必须开发自己的逻辑并更改一些查询。 Memcached可以在这里找到:

http://memcached.org/

网上提供了许多教程

答案 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