2015-07-11 100 views
1

我对数据库相对来说比较新;很抱歉,如果这是我还没有吸收的知识。我google搜索,但没有找到满意的答案。我正在编写一个程序,它遍历〜20mio文件,并将它们的文件名全部放在一个表中(我有强烈的选择将它保存在一张表中供将来使用)。每个file_name包含BIGINT id(以及其他Ascii字符)。每个BIGINT id只有约20 file_name。我现在的问题:我可以利用这个名称结构来获得更好的查询性能吗?优化查询性能,MySQL

我的表结构至今:

CREATE TABLE IF NOT EXISTS files 
     (file_name VARCHAR(40) CHARACTER SET ascii NOT NULL PRIMARY KEY," 
     id BIGINT UNSIGNED, 
     ...) 

我的查询语句只是:

WHERE file_name = '...' 

是它,例如,更好地指数id然后查找file_nameid

非常感谢!

+1

为了判断“查找性能”,我们​​来看看“SELECT”语句。 –

+0

'id'是什么?它是如何计算的?你真的需要它吗? –

回答

2

我知道每个ID可以有20个不同的文件名,所以ID不是唯一的。然后,您不能使用主键的ID。 如果知道file_name是唯一的,唯一的选择是使用file_name作为主键。如果您查找特定的file_name,这将为您提供最佳性能。 如果您还需要查找具有特定ID的所有文件,则必须在ID字段中创建一个非唯一索引。

+1

命名一个列ID然后不存储一个PK将会使任何有意义的表格都感到困惑。 – luksch

1

通常的表格设计是让id成为PRIMARY KEY。如果您还想查询file_name,那么该列上的索引可能是正确的选择。

+0

很酷。非常感谢您的快速回答。 'file_name'实际上是唯一对我很重要的事情。 'id'就是我想要利用的东西;因此问题和你的答案。 不过问题很简单:如果我在PK'id'的顶部编写'file_name',会对性能造成多大影响? – dotwin

+0

〜20mio行使索引当然非常值得使用,特别是当索引是唯一的时候。所以你很可能会发现你的文件幅度比索引更快。您用索引尺寸付款。当索引不再适合数据库的内存时,事情会变得棘手和缓慢。确保数据库有足够的RAM。 – luksch

+0

@luksch - 如果表是InnoDB,那么'PRIMARY KEY'与数据聚集在一起,因此不需要额外的空间。一个_secondary_'INDEX(id)'会花费一堆空间,可能比表本身更多。 –