我有一个拥有超过3500万行的MySQL数据库表。我最初创建了一个id字段作为主键。但是这个id字段只是一个auto_increment
值,不属于我的数据。但我的主要查询是在一个名为zipcode的字段上。
使用WHERE zipcode=''
进行的查询似乎非常慢。我意识到索引zipcode字段会加快这一速度。但是,我注意到索引的每个字段占用了一定的空间。邮政编码索引的索引仅占用75MB,但“id”字段主键索引占用超过3GB。
由于我没有使用“id”字段,我现在已经删除了id字段,只保留了zipcode字段的索引。我只觉得id领域无缘无故占据了空间。没有唯一的id字段有什么缺点吗?
我可以通过其他方式加快对此数据库表的查询速度吗?
答案 0 :(得分:1)
通过维护主键,甚至是所谓的代理主键(如自动增量id
列),可以获得一些显着优势。
首先,如果您需要使用phpMyadmin或MySQL workbench等工具,它可以让您编辑表格。如果没有主键,则这些工具无法更新您的表格。
另一方面,在InnoDB中,主键是每个索引的默认部分,因此使用索引的操作变得更快。例如,如果您想在表格中找到包含最多人口的条目,您可以这样做:
SELECT *
FROM tabl t
JOIN ( SELECT ID
FROM tabl
ORDER BY population DESC
LIMIT 10
) s ON s.ID = t.ID
如果你索引population
并且你有一个主键,那么这将非常快,例如。
你说你的ID
索引消耗3GB。总结一下,1TB磁盘驱动器的成本为100美元。因此,您的3GB索引使用价值0.30美元的资源。节省空间是一种错误的优化。
不要删除主键。