3

我正在开发一个数据库,它是一个相当大的数据库,有 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 分钟这是预期的吗?

我必须制作一份报告,其中我必须使用整个历史数据,即整个 13 亿行。我可以逐批执行此操作,但随后我将不得不一次又一次地运行花费太多时间的查询。

当简单查询花费这么多时间时,我无法执行任何其他需要连接和案例语句的复杂查询。

4

6 回答 6

7

一个常见的做法是,如果您有大量数据,您...

  1. 不应该SELECT *:你应该只选择你想要的列
  2. 应该将您的获取范围限制在一个较小的数字:我敢打赌您不会同时处理 50000 条记录。尝试批量获取它。
于 2012-12-28T09:57:50.077 回答
1

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

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

您将不得不开发自己的逻辑并更改一些查询。Memcached 可在此处获得:

http://memcached.org/

网上有很多教程

于 2012-12-28T09:57:41.543 回答
1

在你的 my.conf 中启用最多 N 秒的慢查询,然后执行一些查询并观察这个日志,这会给你一些线索,也许你可以在这个表中添加一些索引。

或者用 EXPLAIN 做一些查询。http://hackmysql.com/case1

于 2012-12-28T10:04:34.733 回答
0

一个通常很容易获胜的快速说明...

如果您有任何大文本 blob 列,请尝试选择除这些字段之外的所有内容。我已经看到 varchar(max) 字段绝对会降低查询效率。

于 2013-01-06T04:25:23.027 回答
0

您有一个非常宽的平均行大小和 35 列。您可以尝试对表进行垂直分区,也就是说,将表拆分为较小的表,这些表彼此 1:1 相关,其中包含表中的列子集。InnoDB 将行存储在页面中,并且对于非常宽的行效率不高。

如果数据是仅附加的,请考虑查看 ICE。

您可能还会查看 TokuDB,因为它支持良好的压缩。

您可以考虑使用分区和 Shard-Query ( http://code.google.com/p/shard-query ) 来并行访问数据。您还可以使用 Shard-Query 在多个服务器上拆分数据以实现并行性。

于 2013-05-22T07:51:29.757 回答
-2

尝试添加 WHERE 子句:WHERE 1=1 如果它没有任何效果,那么您应该将引擎类型更改为MyISAM

于 2012-12-28T09:53:26.823 回答