2011-06-01 57 views
13

所以我有一个问题。索引或唯一?有什么更好的MySql

假设你有一个表请求,它表示一个图。请求表中有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'; 
+1

“更快”取决于您计划如何针对数据进行搜索。典型的查询会是什么样子? – 2011-06-01 18:39:02

+0

Oko,只是更新了项目。对不起,我忘记了查询。我可能会对NEW REQUESTS做更多的请求,而不是A有B – Michael 2011-06-01 18:49:48

+0

的请求我建议在A和B上都设置一个正常的索引,它会给你提供良好的性能和灵活性。不要使用独特的约束,MD5可能会发生碰撞,但是可能性很小,您会放慢速度。最后一点MD5已不再安全,“散步不会跑到像SHA512那样更安全的散列。” – Johan 2011-06-01 20:34:35

回答

3

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

更多关于复合索引:

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

此外,独特性(A,B)不应该的问题,除非你的要求是,B只能请求最多一次。

+0

@AJ,在这里我没有看到复合索引的用例,如果我只想查找B,我就搞定了复合索引。请赐教? – Johan 2011-06-01 20:30:31

+2

@Johan - 阅读手册。 “如果表格有多列索引,则优化器可以使用索引的任何最左边的前缀查找行。例如,如果(col1,col2,col3)上有三列索引,则索引(col1),(col1,col2)和(col1,col2,col3)的搜索功能。“OP指定了两个查询:一个用于在A中搜索值,另一个用于在A,B中搜索值。如果需要在** B **上进行搜索,则OP需要指定并且我将修改我的答案。 – 2011-06-01 20:31:53

+2

@AJ我知道所有我只是讨厌复合键,因为他们杀死你的灵活性,更好地开始与简单的索引,并在您的数据库和前端设计已稳定后,你需要额外的5%的速度复合键,或无论百分之百的复合键给你。尽管我在这里看到你的观点,技术上你是对的,如果我不喜欢这些来自地狱的复合键,我会赞成你。 – Johan 2011-06-01 20:51:11

34

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

指标
索引是一个隐藏的额外列保存的指针您的真实数据进行排序相同的数据。使用索引可以使用order by时,因为项目进行了预先排序

  1. 快速查找特定项目
  2. 快速找到各类物品
  3. 节省时间(x和y之间)的
  4. 保存时间因使用group by因为组需要匹配相同的项目

这是一个正常的索引,它不介意dup实体值,除了始终唯一的主键以外。

独特的(指数)
如果你想避免重复值,你可以把一个unique index就可以了。这将完成上述所有操作,但在每次更新时添加额外的检查,并插入以检查该值是否已经在数据库中。如果您尝试在唯一列上插入重复行,MySQL将发出错误并拒绝您的插入。
(你不能让一排unique不使用索引)

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

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

当使用索引,何时不
不要把索引上的每个领域。如上所述,它会减慢您的速度并降低insert s和update
始终在联接标准上添加索引。并且认真考虑在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/

+0

很好回答顺便说一句,我只是回顾这些老问题之一。这是更丰富的答案! :) – Michael 2014-05-12 02:04:36

+0

很好的答案,感谢您对隐藏主键的提示 – wolfgang 2015-03-01 14:04:08