索引还是唯一?什么是更好的MySql

Mic*_*ael 16 mysql indexing key unique

所以我有一个问题.

假设您有表请求,表示图形.请求表中有3列,A,B,时间.A - > B当时.因此,每一行代表的是在时间T从A(请求者)到B(被请求者)的定向连接(时间仅用于组织数据,而不是用于其他任何事情).

那么如果说请求是1,000,000行,那么更快.
指数(A,B)指数(A)和指数(B)唯一(A,B)?

多谢你们!A,B是VARCHAR(32)(MD5的)

对不起,我忘记了一个典型的查询.
我需要能够看到用户A(谁登录)是否有任何请求!
我还需要搜索以验证用户是否接受了正确的请求,A接受B.

所以这些陈述看起来像.

有任何新请求吗?

SELECT B, time
FROM requests
WHERE A='$id';  
Run Code Online (Sandbox Code Playgroud)

A有B的要求吗?

SELECT time
FROM requests
WHERE A='$A' and B='$B';
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 38

索引和唯一是两个完全不同的概念.

索引
索引是一个隐藏的额外列,其中包含使用指向实际数据的指针排序的相同数据.使用索引即可

  1. 快速查找特定项目
  2. 快速查找一系列项目(x和y之间)
  3. 使用时节省时间,order by因为项目是预先排序的
  4. 使用时节省时间,group by因为group by需要匹配相同的项目

这是一个普通索引,它不介意重复值,除了主键始终是唯一的.

唯一(索引)
如果要避免重复值,可以在其unique index上放置.这将完成上述所有操作,但在每次更新时添加额外的检查并插入以检查数据库中是否已存在该值.如果您尝试在唯一列上插入重复行,MySQL将给出错误并拒绝您的插入.
(如果unique不使用索引,则无法创建行)

使用索引会减慢插入和更新速度.
使用唯一索引会减慢甚至更慢.

然而,索引加速了select很多,很多.
Unique不会加快任何事情,确保您不会意外插入重复的行.

何时使用索引,何时不使用索引不在
每个字段上放置索引.如上所述它会让你放慢insertS和updates下降.
始终在连接条件上添加索引.并且认真考虑在where条款中使用一个索引很多.
如果50%的行在字段中具有相同的值,MySQL将拒绝使用索引,因此忘记布尔(Y/N)字段上的索引,99%的时间它们将无法工作.
(低基数字段中的索引无效)

始终分配主键
始终在表上分配主键.优选的类型integer autoincrement.如果没有分配主键,MySQL将为您分配一个"隐藏"主键(类型为整数自动增量),但您不能使用隐藏的PK来加快引号或识别您的行,并且还有许多其他键隐藏PK的慢速问题让他们非常糟糕.

希望这可以帮助.

链接:
MySQL如何使用索引:http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
何时使用索引:http://www.howtoforge.com/when-to-use -indexes-in-mysql-databases
更多的东西:http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm
如果你想要最后潜伏在这里了解有关MySQL的更多信息:http://planet.mysql.com/


AJ.*_*AJ. 3

在这种特定情况下,请使用包含 A 和 B 的复合索引。确保 A 位于索引中的第一个。这样,当您运行这两个查询时,索引将用于这两个查询。

有关综合指数的更多信息:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

另外,唯一性 (A,B) 并不重要,除非您要求 B最多只能请求 A一次。

  • @Johan - 阅读手册。“如果表具有多列索引,则优化器可以使用索引的任何最左边的前缀来查找行。例如,如果您在 (col1, col2, col3) 上有一个三列索引,则您已索引(col1)、(col1、col2) 和 (col1、col2、col3) 的搜索功能。”OP 指定了两个查询:一个搜索 A 中的值,另一个搜索 A、B 中的值。如果需要在 **just B** 上进行搜索,OP 需要指定这一点,我将修改我的答案。 (2认同)
  • @AJ我知道我只是讨厌复合键,因为它们会破坏你的灵活性,最好从简单的索引开始,并在你的数据库和前端设计稳定后引入复合键,并且你需要额外的 5% 的速度,或者其他什么微小的百分比复合键给你。不过,我在这里明白你的观点,从技术上讲,你是正确的,如果我不是那么不喜欢那些来自地狱的复合键,我会投票给你。 (2认同)