mysql - 索引还是唯一? MySql用什么好

标签 mysql indexing key unique

所以我有一个问题。

假设您有一个表 requests,它表示一个图表。请求表中有 3 列,A、B、时间。 A -> B 在时间。所以每一行代表的是在时间 T 从 A(请求者)到 B(被请求者)的定向连接(时间只是用于组织数据,而不是真正用于其他任何事情)。

如果说请求是 1,000,000 行,那么什么会更快。
索引(A,B) 索引(A)和索引(B) 唯一(A,B)?

谢谢各位!并且 A, B 是 VARCHAR(32) (MD5's)

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

所以语句看起来像。

有什么新要求吗?

SELECT B, time
FROM requests
WHERE A='$id';  

A 有没有来自 B 的请求?

SELECT time
FROM requests
WHERE A='$A' and B='$B';

最佳答案

Index和unique是两个完全不同的概念。

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

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

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

唯一(索引)
如果你想避免重复值,你可以在上面放一个unique index。这将执行上述所有操作,但会在每次更新和插入时添加额外检查,以检查该值是否已存在于数据库中。如果您尝试在唯一列上插入重复行,MySQL 将给出错误并拒绝您的插入。
(不使用索引就不能使行唯一)

索引的使用减慢了插入和更新的速度。
使用唯一索引会减慢甚至更多。

但是索引大大加快了选择的速度。
Unique 不会加快任何速度,它确保您不会意外插入重复的行。

何时使用索引,何时不使用
不要在每个字段上都放置索引。如上所述,它会减慢您的插入更新速度。
始终在连接条件上放置一个索引。并认真考虑在 where 子句中经常使用的列上放置索引。
如果 50% 的行在一个字段中具有相同的值,MySQL 将拒绝使用索引,因此忘记 bool (Y/N) 字段上的索引,99% 的时间它们将不起作用.
(低基数字段中的索引没有用)

始终分配一个主键
不过,请始终在您的表上分配一个主键。最好是 integer autoincrement 类型。如果不分配主键,MySQL 会为您分配一个“隐藏”主键(整数自增类型),但您不能使用隐藏的主键来加快报价或识别您的行,隐藏的 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/

关于mysql - 索引还是唯一? MySql用什么好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6206043/

相关文章:

PHP PDO : Stored Procedure Return Empty Result

Python。基于两个键和一个字典对二维列表进行排序

mysql - Kettle:想要将字符串值映射到另一个表中的id

php - 我想从 php 对象类添加自定义属性

mysql - 需要Mysql评级和排名教程

mysql - 索引查询执行从几秒跳到几小时,数据增加最少

mysql - SQL - 最大长度255唯一索引 - 哈希解决方案

sql - Postgresql:是否需要在作为复合唯一约束一部分的列上定义单列索引?

c# - 如何检测C#表单中是否按下了多个键

java - 带有列表打印输出的树/ HashMap