MySQL索引设计与表分区

时间:2011-06-11 17:54:34

标签: mysql database-design indexing partitioning

我有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作为存储引擎;

所以这是我的问题;

  1. 我是否需要创建另一个索引 titlehash列作为主要列 key(articleId,titlehash)不是 有利于搜索 titlehash列,因为它是第二个 主键上的列?

  2. 这有什么问题 设计?

  3. 我需要选择非常快并且期望表格有数百万行,请注意 int Id列对业务层不可见,并且永远不能用于查找记录

    我来自sql server后台并且使用mysql,因为在sql server上使用分区将花费我一大笔钱,因为它只在企业版中提供。

    所以DB大师,请帮助我;非常感谢。

1 个答案:

答案 0 :(得分:1)

如上所述,您的“最重要的查询”实际上似乎根本不涉及User表。如果不存在缺失的东西,加快这一点的最佳方法是从图片中取出User表并在titleHash上创建索引。热潮,完成。

如果该查询还有另一个条件,我们需要知道提供更具体的建议是什么。

鉴于您的更改,关键应该是所有必需的:

  • Article上:
    • PRIMARY KEY (articleId)(没有其他专栏,不要试图看中)
    • KEY (userId)
    • UNIQUE KEY (titleHash)
  • User上:
    • PRIMARY KEY (userId)

不要试图使用复合主键。 InnoDB可以更有效地处理由自动递增整数组成的主键,因为该键可以在内部用作行ID。实际上,您可以“免费”获得一个整数主键。

最重要的是,使用真实数据进行测试,并查看EXPLAIN查询的结果。