gpt4 book ai didi

MySQL索引设计与表分区

转载 作者:行者123 更新时间:2023-11-29 14:48:30 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com