我有 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 在设计上是独一无二的,通常不会更改。
articleId 和 userid 列不是业务键,并且对应用程序不可见,因此它们仅用于联接。
我将在 titlehash 列上使用 mysql 表分区,这样选择会更快,因为数据库将能够基于该列使用分区消除。
我使用innoDB作为存储引擎;
这是我的问题;
我需要创建另一个索引吗 titlehash 列作为主列 键 (articleId,titlehash) 不是 有利于搜索 titlehash 列,因为它是第二个 主键上的列?
这有什么问题 设计?
我需要非常快的选择,并期望表有数百万行,请注意int Id 列对业务层不可见并且永远不能用于查找记录
我有 sql server 背景,打算使用 mysql,因为在 sql server 上使用分区会花费我一大笔钱,因为它仅在企业版中可用。
所以数据库大师们,请帮助我;非常感谢。
最佳答案
正如所写,您的“最重要的查询”实际上似乎根本不涉及 User
表。如果不仅仅是缺少某些内容,加快速度的最佳方法是将 User
表从图片中删除并在 titleHash
上创建索引。繁荣,完成。
如果该查询还有其他条件,我们需要知道它是什么才能提供更具体的建议。
考虑到您的更改,就 key 而言,所有必要的操作都应该是:
- 在
文章
上:PRIMARY KEY (articleId)
(没有其他列,不要试图显得花哨)KEY(用户 ID)
唯一 key (titleHash)
- 在
用户
上:主键(用户 ID)
不要尝试使用复合主键。仅由自动递增整数组成的主键可以由 InnoDB 更有效地处理,因为该键可以在内部用作行 ID。实际上,您“免费”获得一个整数主键。
最重要的是,使用真实数据进行测试并查看EXPLAIN
查询的结果。
关于MySQL索引设计与表分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317593/