MySQL和NoSQL:帮我选择合适的一个

12 浏览
0 Comments

MySQL和NoSQL:帮我选择合适的一个

有一个庞大的数据库,有10亿行,名为threads(这些线程实际存在,我不是因为喜欢而刻意增加难度)。Threads表中只有一些内容,以提高查询速度:(int id,string hash,int replycount,int dateline(时间戳),int forumid,string title)

查询:

select * from thread where forumid = 100 and replycount > 1 order by dateline desc limit 10000, 100

由于有10亿条记录,这是一个相当慢的查询。所以我想,让我们将这10亿条记录分成尽可能多的表,每个论坛(分类)一个表!这几乎是完美的。有了这么多表,我需要搜索的记录更少,速度真的更快。现在的查询变成了:

select * from thread_{forum_id} where replycount > 1 order by dateline desc limit 10000, 100

对于99%的论坛(分类)来说,这真的更快,因为大多数论坛(分类)只有很少的主题(10万-100万)。然而,因为有一些表有大约1000万条记录,某些查询仍然太慢(0.1 / 0.2秒,对于我的应用程序来说太多了!我已经使用了索引!)。

我不知道如何使用MySQL来改善这个问题。有没有办法?

对于这个项目,我将使用10台服务器(12GB内存,4个7200rpm硬盘软件RAID 10,四核)。

最初的想法是将数据库简单地分布在这些服务器上,但由于上述问题,这还不够。

如果我在这10台服务器上安装cassandra(假设我找到时间使其正常工作),是否应该能够提高性能?

我该怎么办?继续使用MySQL在多台机器上进行分布式数据库,还是构建一个cassandra集群?

有人要求我发布索引,下面是索引:

mysql> show index in thread;
PRIMARY id
forumid
dateline
replycount

查询解释:

mysql> explain SELECT * FROM thread WHERE forumid = 655 AND visible = 1 AND open <> 10 ORDER BY dateline ASC LIMIT 268000, 250;
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
| id | select_type | table  | type | possible_keys | key     | key_len | ref         | rows   | Extra                       |
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
|  1 | SIMPLE      | thread | ref  | forumid       | forumid | 4       | const,const | 221575 | Using where; Using filesort | 
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+

0
0 Comments

MySQL和NoSQL:帮我选择合适的数据库解决方案

在选择使用NoSQL还是MySQL的问题中,实际上隐藏着一个根本性的问题。SQL语言对人类来说很容易编写,但对计算机来说却很难解析。在高容量数据库中,我建议避免使用SQL后端,因为这需要额外的步骤-命令解析。我进行了大量的基准测试,发现在某些情况下,SQL解析器是最慢的一环。对此你无能为力。好吧,你可以尝试使用预解析的语句并访问它们。

顺便说一下,并不是众所周知,MySQL起源于NoSQL数据库。MySQL的作者David和Monty所在的公司是一个数据仓库公司,他们经常不得不为非常规的任务编写自定义解决方案。这导致了一大堆自制的C库,用于手动编写数据库函数,当时Oracle和其他数据库在性能上表现不佳。SQL在1996年添加到了这个将近20年历史的数据库中,只是出于好玩。之后发生了什么你们都知道。

实际上,你可以避免MySQL中的SQL开销。但通常情况下,SQL解析并不是最慢的部分,只是好知道而已。要测试解析器的开销,你可以简单地进行"SELECT 1"的基准测试。

0
0 Comments

MySQL和NoSQL:帮我选择正确的数据库

在这段内容中,问题的出现原因是对查询性能的优化需求。问题涉及到选择合适的数据库来提高查询效率。解决方法是创建索引,并进行适当的查询优化。

首先,根据给定的forumid、hasreplies和dateline进行查询。为了优化查询性能,可以创建一个包含这三个字段的索引:INDEX(forumid, hasreplies, dateline)。

接下来,在执行查询时,会先根据forumid定位到相应的子树,这是一个对数操作。然后,在匹配forumid的前提下,再定位到满足hasreplies = 1的子树,这是一个常数时间操作。最后,在按dateline排序的子树中遍历以获取所需结果,而无需读取和重新排序整个论坛帖子列表。

需要注意的是,大量的OFFSET(偏移量)值会降低查询性能,因为MySQL似乎无法通过直接读取BTREE来跳过偏移量。因此,OFFSET值越大,查询速度越慢。

解决OFFSET问题的方法是基于dateline模拟OFFSET,即使用"dateline > Y LIMIT 100"代替"LIMIT Z, 100",其中Y是偏移量为Z的项的日期。这种方法可以消除与偏移量相关的性能问题,但会阻止直接跳转到第100页中的第100个结果。

对于分页查询,可以通过记住每一页的最后一项的dateline值来实现。例如,可以将dateline值添加到页面链接中,并在获取下一页时使用该值进行查询。这是许多NoSQL解决方案处理分页的方法。

总结起来,选择合适的数据库可以提高查询性能。在MySQL中,通过创建适当的索引并进行查询优化可以达到这一目的。对于大量偏移量的情况,可以使用基于dateline的模拟OFFSET方法来提高性能。而对于分页查询,可以通过记住每一页的最后一项的dateline值来实现。

感谢这个社区和它的用户的帮助和解答!

0