有一个大的数据库,1,000,000,000行,称为线程(这些线程实际存在,我不是因为我喜欢它而使事情变得更难).线程中只有一些东西,以加快速度:(int id,string hash,int replycount,int dateline(timestamp),int forumid,string title)
查询:
select * from thread where forumid = 100 and replycount > 1 order by dateline desc limit 10000, 100
由于存在1G的记录,因此查询速度非常慢.所以我想,让我们在尽可能多的论坛(类别)中将这1G记录分开!这几乎是完美的.有很多表我搜索的记录较少,而且速度真快.查询现在变为:
select * from thread_{forum_id} where replycount > 1 order by dateline desc limit 10000, 100
99%的论坛(类别)真的更快,因为大多数论坛只有少数主题(100k-1M).但是因为有一些大约有10M的记录,一些查询仍然会变慢(0.1/.2秒,对我的应用来说太多了!我已经在使用索引!).
我不知道如何使用MySQL改进这一点.有办法吗?
对于这个项目,我将使用10台服务器(12GB内存,4x7200rpm硬盘,软件raid 10,四核)
这个想法是简单地在服务器之间拆分数据库,但是上面解释的问题仍然没有得到解决.
如果我在这10台服务器上安装cassandra(通过假设我找到时间让它按预期工作)我应该假设性能提升吗?
我该怎么办?继续使用MySQL与多台机器上的分布式数据库或构建一个cassandra集群?
我被要求发布索引是什么,这里是:
mysql> show index in thread;
PRIMARY id
forumid
dateline
replycount
Run Code Online (Sandbox Code Playgroud)
选择说明:
mysql> explain SELECT * FROM thread WHERE forumid = 655 AND visible = 1 AND open …Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我主要指数和次要指数之间的确切区别是什么?主要和次要指数类别下的不同指数有哪些?使用主索引比二级索引有什么好处,反之亦然?
我为用户创建了一个消息传递系统,它允许他们向另一个用户发送消息.如果这是他们第一次说话,那么就会启动新的会话,如果不是旧的会话继续.
用户收件箱列出了用户与所有其他用户进行的所有对话,然后由具有最新帖子的对话对这些对话进行排序.
用户只能与另一个用户进行一次对话.
当用户点击其中一个对话时,他们会被带到一个页面,显示他们在顶部有最新帖子的整个对话.所以它有点像消息聊天功能.
我有两张桌子:
userconversation
包含一个自动增量ID,它是会话ID,以及userId和friendId.
无论是谁发起第一个对话都将是userId和收件人friendId,这将永远不会改变该对话.
+----+--------+----------+
| id | userId | friendId |
+----+--------+----------+
Run Code Online (Sandbox Code Playgroud)
usermessages
包含特定消息,以及读取标志,时间和conversationId
+----+---------+--------+------+------+----------------+
| id | message | userId | read | time | conversationId |
+----+---------+--------+------+------+----------------+
Run Code Online (Sandbox Code Playgroud)
这个怎么运作
当用户转到另一个用户的消息时,将运行查询以检查两个用户是否在userconversation表中匹配,如果是,conversationId则使用该会话并且会话继续进行,如果不是,则为他们创建具有唯一的新行conversationId.
它变得复杂的地方
到目前为止一切都很好,但是当涉及到显示所有对话的消息收件箱时,按照最新的帖子进行排序,一个查询就变得棘手了.
为了能够列出对话,您必须首先找到每个对话的最新帖子,但由于您无法在组之前订购,因此无法对两个表上的一个查询进行排序,因此我必须使用以下内容:
SELECT
c.id,
c.userId,
c.friendId,
m2.message,
m2.read,
UNIX_TIMESTAMP(m2.time),
user1.username,
user2.username
FROM
(SELECT MAX(m1.id) AS MessageID
FROM usermessages m1
GROUP BY m1.conversationId) latest_msg
INNER JOIN usermessages m2 ON latest_msg.MessageID = m2.id
INNER JOIN userconversation c ON m2.conversationId …Run Code Online (Sandbox Code Playgroud) 美好的一天,
我一直在学习数据库和数据库设计,我发现我仍然无法回答自己无法回答的问题.所以我向社区提出这样一个问题,希望有更多知识/经验的人能够回答它.
我的任务是建立一个跟踪船队库存水平的数据库.
目前的设计为每艘船提供了一张表格,列出了所有可能的零件(机械类型,零件编号,品牌,序列号等)
这意味着一件机器或零件的细节可以重复多次(实际上是船舶的次数).
我一直在尝试根据自己学到的东西进行重新设计,并且我会提出如下设计:
[SHIP]
ID, Name, Class, Tonnage, Fleet, Superintendent etc.
[Machinery]
ID, Type, Make, Model etc. (Can have separate table for manufacturers and types if required)
[Part]
ID, Part number, Description, etc.
Run Code Online (Sandbox Code Playgroud)
以上是现在的三个主要表格,它开始变得困难.
每艘船可以有多个机器项目,每个机械项目可以存在于多艘船上(需要一个连接表)
每个机械零件可以有多个零件,每个零件可以属于多个机械零件(另一个接合台)
成千上万的零件可能会使接合台变得庞大.
此外,只要您想跟踪库存,您就会看到另一个联结表
[Stock Level]
ShipID, PartID, Stock Level
Run Code Online (Sandbox Code Playgroud)
此外,如果您想要最低库存(可以与库存水平相结合?)
[Min Stock]
ShipID, PartID, Min Stock
Run Code Online (Sandbox Code Playgroud)
最后,如果您正在寻找标准化数据库(即没有第1部分,第2部分或序列号1,序列号2)
你需要一些额外的桌子
[Serial Numbers]
ShipID, MachineryID, Serial No
[Part Numbers]
PartID, Part Number
Run Code Online (Sandbox Code Playgroud)
序列号可能是相当标准的并且没有问题,但是[部件号]将至少需要与[部件]表中的记录一样多的记录.
地图(尽管我可以代表没有图片,但为简单起见省略了交叉点)
<>V represent many
-| represent one
-----< Serial Numbers
| V …Run Code Online (Sandbox Code Playgroud)