【问题标题】:Tables with 30mln entries are slow. Optimize MySQL or switch to mongodb?具有 3000 万个条目的表很慢。优化 MySQL 还是改用 mongodb?
【发布时间】:2011-06-12 04:11:07
【问题描述】:

我在一台服务器上运行了一个简单的 mysql 数据库,其中包含两个表:产品和评论。 products 表有大约 1000 万个条目,reviews 表有大约 3000 万个条目。

整个 Db 大约是 30Gb。我觉得它变慢了,我想知道我应该怎么做。我创建了索引,但没有帮助。例如,产品表有类别字段,当我做一个简单的select * from products where category=2 时 - 它只是很慢。

在这种情况下切换到 mongodb 会帮助我还是我可以通过某种方式优化 Mysql 来解决这个问题?在这种情况下我应该进行分片还是表的大小不是那么大,并且可以通过其他方式进行优化?

表格和 my.cnf

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL auto_increment,
  `product_title` varchar(1000) NOT NULL,
  `product_id` varchar(100) NOT NULL,
  `title` varchar(1000) NOT NULL,
  `image` varchar(1000) NOT NULL,
  `url` varchar(1000) NOT NULL,
  `price` varchar(100) NOT NULL,
  `reviews` int(11) NOT NULL,
  `stars` float NOT NULL,
  `BrowseNodeID` int(11) NOT NULL,
  `status` varchar(100) NOT NULL,
  `started_at` int(15) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_index` (`BrowseNodeID`),
  KEY `status_index` (`status`),
  KEY `started_index` (`started_at`),
  KEY `id_ind` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13743335 ;


CREATE TABLE IF NOT EXISTS `reviews` (
  `id` int(11) NOT NULL auto_increment,
  `product_id` varchar(100) NOT NULL,
  `product_title` varchar(1000) NOT NULL,
  `review_title` varchar(1000) NOT NULL,
  `content` varchar(5000) NOT NULL,
  `author` varchar(255) NOT NULL,
  `author_profile` varchar(1000) NOT NULL,
  `stars` float NOT NULL,
  `owner` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `product_id` (`product_id`),
  KEY `id_index` (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=48129737 ;

来自 my.cnf 的一些信息

set-variable    = query_cache_size=1512M
set-variable    = thread_cache_size=8
thread_concurrency = 8
skip-innodb
low-priority-updates
delay-key-write=ALL

key_buffer_size = 100M
max_allowed_packet = 1M
#table_open_cache = 4048
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 50M
set-variable    = table_cache=256
set-variable    = query_cache_limit=1024M
set-variable    = query_cache_size=1024M

【问题讨论】:

  • 你能提供你的 my.cnf 和表定义吗?
  • 什么是“慢”?所涉及的表、索引或所涉及的查询/查询没有详细信息——听起来更像是您希望有理由切换到 mongodb。
  • 分类栏的选择性是什么?也许索引根本无助于选择 * ....
  • @Chris Henry 整个 my.cnf?它很大。有什么特别的变量吗?
  • 缓冲池大小最有帮助,具体取决于您使用的是 MyISAM 还是 InnoDB

标签: mysql mongodb scalability database


【解决方案1】:

根据您的 my.cnf,您的 key_buffer_size 看起来好像太小了方式,因此您每次读取都要使用磁盘。理想情况下,该值应设置为大于 MyISAM 索引的总大小。

在更改数据库技术之前,您可能还需要考虑将表类型更改为 InnoDB。您的 my.cnf 现在已将其禁用。我从具有智能索引和足够内存的 300M 行表中获得了相当出色的性能。 InnoDB 还将为您提供一些运行时间更长的读取空间,因为它们不会锁定您的整个表。

【讨论】:

  • 感谢您的建议。 300M?这很让人佩服!都在同一个服务器和一个表中?没有分片?你有多少内存?你能用 WHERE 或 order 进行简单的查询吗?
  • @Arty - stackoverflow.com/questions/4419499/…(我的桌面)
猜你喜欢
  • 2017-10-11
  • 2011-12-22
  • 2014-01-09
  • 2021-10-30
  • 2010-10-01
  • 2012-06-05
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多