【问题标题】:MySQL index design with table partitioning带有表分区的 MySQL 索引设计
【发布时间】:2011-06-11 17:54:33
【问题描述】:

对于一个有点像杂志的网站,我有 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 表分区,这样选择会更快,因为 db 将能够使用基于该列的分区消除。

我使用innoDB作为存储引擎;

这是我的问题;

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

  2. 这有什么问题 设计?

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

我是 sql server 背景,打算使用 mysql,因为在 sql server 上使用分区会花费我一大笔钱,因为它只在企业版中可用。

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

【问题讨论】:

    标签: mysql database-design indexing partitioning


    【解决方案1】:

    正如所写,您的“最重要的查询”实际上似乎根本不涉及User 表。如果不只是缺少某些东西,那么加快此过程的最佳方法是将User 表从图片中删除并在titleHash 上创建一个索引。砰,完成了。

    如果该查询还有其他条件,我们需要知道它是什么才能提供更具体的建议。

    鉴于您的更改,就键而言,所有必要的都是:

    • 开启Article:
      • PRIMARY KEY (articleId)(没有额外的列,不要试图花哨)
      • KEY (userId)
      • UNIQUE KEY (titleHash)
    • 开启User:
      • PRIMARY KEY (userId)

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

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

    【讨论】:

    • 哎呀——真的很抱歉我错过了;查询中需要包含用户名和电子邮件。现已更正——感谢您的快速回复
    • 谢谢 - 但是如果在 titlehash 列上进行表分区,它不会提高性能吗?另一件事是分区列必须是主键的一部分。所以如果我们需要使用分区我们必须将titlehash放在PK中。另外由于auto inc int列已经是clutered PK中的第一个col,mysql排序会不会有问题?
    • 分区消除(您在此处进行的优化)仅对范围查询非常有用(例如,col BETWEEN 123 AND 456。由于范围查询在散列上无用,因此具有“正常”索引该列同样有效。
    • 好的,但是假设:我根据唯一的 titlehash 将表分区为 1000 个分区。因此,它将在整个分区中均匀分布行。即如果表有 1 亿行,则一个分区将只有 100,000 行。这样当在titlehash列上做select时,mysql只需要查找与数据行在同一个分区(也是分区)的uniquekey(titlehash)部分,所以索引查找会快很多。插入也不会受到影响,因为 PK(articleId,titlehash) 具有已经排序的 indentity col;我说的对吗?
    • 必须为 1000 个不同的表存储额外的元数据对性能的影响可能比拥有它们所获得的加速更重要。
    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多