【问题标题】:SQL PHP - what is faster? [closed]SQL PHP - 什么更快? [关闭]
【发布时间】:2016-11-20 10:56:50
【问题描述】:

我正在创建一个包含超过 13 亿行的数据库表。

结构:ID、info1、info2、info3、city

在 13 亿行中,有很多同一个城市的。
我想知道,什么会更快(使用 PDO PHP 查找信息时)

  • 将城市保存为平原
  • 保存一个 ID(城市 ID)并在另一个表中查找城市 ID,这将为我提供简单的城市

什么更快,为什么?

谢谢!

【问题讨论】:

  • 你有city的索引吗?
  • @MarkBaker 是的,我有。

标签: php mysql sql-server pdo


【解决方案1】:

你的想法是对的。不要多次重复同一个城市。它会减慢您的查询速度,部分原因是城市名称会比整数占用更多的内存空间。更大的表需要更多的时间来处理,并且有近 10 亿行,它应该会产生显着的差异。见this posting

重复相同的名称数千次也使您更有可能引入使查询结果不可靠的变体(错别字)。最后,这种设计将使更改城市名称变得更加困难。

用每个城市的唯一city_id 替换普通城市。在另一个 city 表中,您将拥有相同的 city_id 和一个包含完整城市名称的普通 name

要从更改中获利,您必须让 MySQL 知道这种关系。创建表时,请务必将city_id 设为city 表的主键,并在您的大表中将city_id 设为外键。

如果您想开始跟踪有关城市的更多信息,此更改还可以让您更轻松地扩展数据库。要了解更多信息,请查看数据库规范化

【讨论】:

  • “它会减慢你的查询速度”——这句话需要一些解释。如果您只是通过像 city = 'New York' 这样的确切值来查找,究竟是什么让它比 city_id = 42 慢?
  • @zerkms 基于整数值的索引将小于基于字符串的索引,通常越小速度越快,或者至少对数据库中的索引缓存压力较小。在 JOIN 类型的情况下使用多个索引时,这一点变得尤为重要。此外,比较INTINT 非常快,基本上是一条CPU 指令,但VARCHARVARCHAR 的成本要高得多,并且取决于字符串的长度以及它们在字符方面的接近程度.
  • @tadman 我的意思是 - 它应该被放入答案中。关于性能优化的答案必须有一些证据。仅仅“它会慢下来”是远远不够的。
  • 这里没有有用的“证据”。提出问题的人必须对他们的数据、硬件和一般工作负载进行自己的基准测试。我们只能猜测,但总的来说INT 表现更好。
  • @zerkms VARCHAR 上的索引通常仅限于前 N 个字符,如果名称经常超过此限制,那么您将轻松获得超过 31 次比较。当由于某种原因无法使用索引并且需要行扫描时,这也是一个问题。我不确定他们是否已经解决了这个问题,但是当使用像 UUID 这样始终在这个索引窗口上的字符串时,我看到了一些非常奇怪的行为。您可以在创建索引时根据需要对其进行调整,但它仍然无法解决字符串索引会更大的事实。
猜你喜欢
  • 2011-09-18
  • 2012-10-28
  • 2017-01-18
  • 2018-10-05
  • 2012-11-09
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多