所以我有一个问题。
假设您有表请求,表示图表。请求表中有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';
A有来自B的请求吗?
SELECT time
FROM requests
WHERE A='$A' and B='$B';
答案 0 :(得分:38)
索引和唯一是两个完全不同的概念。
<强>索引强>
索引是一个隐藏的额外列,其中包含使用指向实际数据的指针排序的相同数据。使用索引,你可以
order by
时节省时间,因为项目已预先排序group by
时节省时间,因为group by需要匹配相同的项目这是一个普通索引,它不介意重复值,除了主键始终是唯一的。
独特(指数)
如果您想避免重复值,可以在其上放置unique index
。这将完成上述所有操作,但在每次更新时添加额外的检查并插入以检查数据库中是否已存在该值。如果您尝试在唯一列上插入重复行,MySQL将发出错误并拒绝您的插入
(如果不使用索引,则无法创建行unique
使用索引可以减慢插入和更新速度 使用唯一索引会减慢甚至更慢。
然而,索引加速select
很多,很多
<{1}}不会加快任何事情,确保您不会意外插入重复的行。
何时使用索引,何时不使用
不要在每个字段上放置索引。如上所述,它会减慢Unique
和insert
的速度
始终在连接条件上添加索引。并且认真考虑在update
子句中使用的索引很多。
如果50%的行在字段中具有相同的值,MySQL将拒绝使用索引,因此忘记布尔(Y / N)字段上的索引,99%的时间它们将无法工作。
(低基数字段中的索引无效)
始终指定主键
务必在桌面上分配主键。优选类型where
。如果你没有分配主键,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/
答案 1 :(得分:3)
在这种特定情况下,使用包含A和B的复合索引。确保A在索引中是第一个。这样,当您运行这两个查询时,索引将用于两者。
有关复合索引的更多信息:
http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html
此外,唯一性(A,B)无关紧要,除非您的要求是B只能请求A 最多一次。