MySql - WAMP - 巨大的表非常慢(2000万行)

时间:2011-09-10 00:04:19

标签: mysql phpmyadmin wamp

所以我发布了this!昨天得到了一个完美的答案,需要先运行此代码:ALTER TABLE mytable AUTO_INCREMENT = 10000001;

我跑了几次,但是在几个小时不能正常工作后重新启动了WAMP。过夜(12小时)后,代码仍未运行。

我想知道我的数据库表大小是否超过了mysql或我的计算机或两者的限制。

然而,我有一种偷偷摸摸的怀疑,正确的索引或其他因素可能会对我的表现产生很大影响。我知道2000万行是很多行,但它太多了吗?

我对索引知之甚少,除了它们很重要。我试图将它们添加到名称和州字段中,我相信我成功了。

顺便说一下,我正在尝试添加一个唯一的ID字段,这就是我昨天的帖子。

所以,问题是:在MySql范围之外是否有2000万行?如果没有,我是否缺少一个索引或其他一些有助于更好地使用这2000万行的设置?我可以在所有列上放置索引并使其超快吗?

一如既往,提前谢谢......

以下是规格:

我的电脑是XP,运行WAMPSERVER,Win32 NTFS,Intel Duo Core,T9300 @ 2.50GHz,1.17 GHz,1.98 GB或RAM

DB:1个表,2000万行 表的大小是: 数据4.4演出,索引1.3演出,总计5.8演出

索引在“BUSINESS NAME”和“STATE”字段

上设置

表格字段如下:

`BUSINESS NAME` TEXT NOT NULL, 
`ADDRESS` TEXT NOT NULL, 
`CITY` TEXT NOT NULL, 
`STATE` TEXT NOT NULL, 
`ZIP CODE` TEXT NOT NULL, 
`COUNTY` TEXT NOT NULL, 
`WEB ADDRESS` TEXT NOT NULL, 
`PHONE NUMBER` TEXT NOT NULL, 
`FAX NUMBER` TEXT NOT NULL, 
`CONTACT NAME` TEXT NOT NULL, 
`TITLE` TEXT NOT NULL, 
`GENDER` TEXT NOT NULL, 
`EMPLOYEE` TEXT NOT NULL, 
`SALES` TEXT NOT NULL, 
`MAJOR DIVISION DESCRIPTION` TEXT NOT NULL, 
`SIC 2 CODE DESCRIPTION` TEXT NOT NULL, 
`SIC 4 CODE` TEXT NOT NULL, 
`SIC 4 CODE DESCRIPTION` TEXT NOT NULL 

3 个答案:

答案 0 :(得分:8)

一些答案​​:

  • 2000万行完全在MySQL的能力范围内。我在一个表中工作的数据库超过5亿行。重组表可能需要数小时,但只要普通查询由索引辅助,普通查询就不是问题。

  • 您的笔记本电脑已经过时,并且不能用作高规模的数据库服务器。进行表重组需要很长时间。较少的内存和通常较慢的笔记本电脑磁盘可能会限制您。您可能也使用MySQL的默认设置,这些设置适用于非常旧的计算机。

  • 我建议不要为每个列使用TEXT数据类型。对于大多数这些列,您没有理由需要TEXT

  • 不要在每个列上创建索引,特别是如果您坚持使用TEXT数据类型。除非您定义前缀索引,否则您甚至无法索引TEXT列。通常,选择索引以支持特定查询。

根据上述内容,您可能还有许多其他问题,但在单个StackOverflow帖子中有太多内容无法涵盖。如果您打算使用数据库,您可能需要接受培训或阅读书籍 我推荐High Performance MySQL, 2nd Edition


重新提出你的后续问题:

对于MySQL调优,这是一个很好的起点:http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/

许多ALTER TABLE操作会导致表重组,这意味着基本上锁定表,使用所应用的更改制作整个表的副本,然后重命名新旧表并删除旧表。如果表非常大,这可能需要很长时间。

TEXT数据类型最多可以存储64KB,这对于电话号码或状态来说是过度的。我会使用CHAR(10)作为典型的美国电话号码。我会将CHAR(2)用于美国州。通常,使用最紧凑和节俭的数据类型,它支持给定列中所需的数据范围。

答案 1 :(得分:2)

这需要很长时间,因为你只有2GB内存和6GB数据/索引,这将迫使RAM和磁盘之间进行大量的交换。但是,你无能为力。

您可以尝试批量运行。

创建一个单独的空表,其中包含auto_increment列。然后一次插入一定数量的记录(例如,一次一个州)。这可能有助于它更快,因为你应该能够完全在内存中处理那些较小的数据集,而不是分页到磁盘。

如果它也在dba.stackexchange.com上,你可能会得到更好的回复。

答案 2 :(得分:0)

我相信硬件很好,但你需要更好地节省资源。

Db结构优化!

  • 请勿使用TEXT
  • 对于phonenumbers使用bigint unsigned。必须解析和转换任何符号或alpha。
  • 对于任何其他字母数字列,请使用例如varchar([32-256])
  • 邮政编码当然是mediumint unsigned
  • 性别应为enum('Male','Female')
  • 销售可以是int unsigned
  • 州应该是enum('Alaska',...)
  • 国家/地区应为enum('Albania',...)

构建大型索引时,最快的方法是创建一个新表并执行INSERT INTO ... SELECT FROM ...而不是ALTER TABLE ...

将State和Country字段更改为enum将大大减少索引大小。

相关问题