MySQL索引设计与表分区

标签 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 在设计上是独一无二的,通常不会更改。

articleId 和 userid 列不是业务键,并且对应用程序不可见,因此它们仅用于联接。

我将在 titlehash 列上使用 mysql 表分区,这样选择会更快,因为数据库将能够基于该列使用分区消除。

我使用innoDB作为存储引擎;

这是我的问题;

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

  2. 这有什么问题 设计?

我需要非常快的选择,并期望表有数百万行,请注意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/

相关文章:

php - 如果 Row1 = 值 1,则更新其他行

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 哪些列应该被索引?

sql - 对复合索引和 FFS 感到困惑

mysql - 当我尝试创建触发器时出错

PHP 5.4 SQL 注入(inject)

mysql - mysql中递归一对多的多对多关系是否需要至少4个表?

oracle - 索引有不同的表空间是否有任何逻辑原因?

mysql - 是否可以在 MySQL 中创建具有 UNIX_TIMESTAMP 默认值的列?

mysql - 在mysql表中存储和查询json