我有2个MySQL表格,其网站的架构类似于杂志。
Article (articleId int auto increment ,
title varchar(100),
titleHash guid -- a hash of the title
articleText varchar(4000)
userId int)
User (userId int autoincrement
userName varchar(30)
email etc...)
最重要的查询是;
select title,articleText,userName,email
from Article inner join user
on article.userId = user.UserId
where titleHash = <some hash>
我正在考虑将articleId和titleHash列一起用作Article表的聚簇主y。并且userId和userName作为用户表的主键。 因为搜索将基于titlehash和userName列。
同样,titlehash和userName在设计上是unqiue,不会正常更改。
articleId和userid列不是业务键,对应用程序不可见,因此它们只能用于连接。
我将在titlehash列上使用mysql表分区,因此选择将更快,因为db将能够使用基于该列的分区消除。
我正在使用innoDB作为存储引擎;
所以这是我的问题;
我是否需要创建另一个索引 titlehash列作为主要列 key(articleId,titlehash)不是 有利于搜索 titlehash列,因为它是第二个 主键上的列?
这有什么问题 设计?
我需要选择非常快并且期望表格有数百万行,请注意 int Id列对业务层不可见,并且永远不能用于查找记录
我来自sql server后台并且使用mysql,因为在sql server上使用分区将花费我一大笔钱,因为它只在企业版中提供。
所以DB大师,请帮助我;非常感谢。
答案 0 :(得分:1)
如上所述,您的“最重要的查询”实际上似乎根本不涉及 User
表。如果不存在缺失的东西,加快这一点的最佳方法是从图片中取出User
表并在titleHash
上创建索引。热潮,完成。
如果该查询还有另一个条件,我们需要知道提供更具体的建议是什么。
鉴于您的更改,关键应该是所有必需的:
Article
上:
PRIMARY KEY (articleId)
(没有其他专栏,不要试图看中)KEY (userId)
UNIQUE KEY (titleHash)
User
上:
PRIMARY KEY (userId)
不要试图使用复合主键。 InnoDB可以更有效地处理由自动递增整数组成的主键,因为该键可以在内部用作行ID。实际上,您可以“免费”获得一个整数主键。
最重要的是,使用真实数据进行测试,并查看EXPLAIN
查询的结果。