【问题标题】:How to create an index for a large DB table如何为大型数据库表创建索引
【发布时间】:2013-03-17 01:22:40
【问题描述】:

我过去做过很多常规的数据库查询,但现在我的数据库大约有 150 万个条目,我需要能够快速搜索实时更新。

我的数据库是所有美国邮政编码和加拿大邮政编码,包括经度、纬度、城市......我需要能够在几分之一秒内提取一个邮政编码并将其发送回(使用 ajax)到网页。因此,当用户输入邮政编码/邮编时,国家、城市和州/省会自动填写。

目前我使用以下查询:

$sql = "SELECT  city, province, country 
  FROM postalcode
  WHERE PostalCode='$zip'";

我以前从未使用过索引。如何创建一个并替换我的查询以获得相同的结果?

(加分!:索引会用mysqldump备份吗?)

谢谢!

【问题讨论】:

    标签: mysql indexing mysqldump


    【解决方案1】:

    您不会替换查询。优化器将使用索引来获取您的查询。该索引驻留在服务器上,不属于mysqldump。不过,它会在您的表的 DDL 中。

    How do I add indices to MySQL tables?。这假设您知道 将索引放在哪个 列上(提示:PostalCode

    【讨论】:

    • +1 奖励问题!谢谢!我会查找您推荐的其他帖子!
    【解决方案2】:

    将索引添加到PostalCode 字段,看看性能是否有所提高。

    我通常使用 phpMyAdmin 来创建我的索引,但您可以按照另一篇帖子的建议使用命令行。

    【讨论】:

      【解决方案3】:

      我认为将您的 ajax 请求一分为二是个好主意。

      第一个 ajax 请求仅从表中提取可用的邮政编码(一个新的,仅包含邮政编码)。

      第二个 ajax 请求在完整输入邮政编码(或当用户未添加新号码时)触发并返回城市和国家/地区。

      减少单列、仅数字表的大小可以改善您的第一个 ajax 请求。

      不过,您必须在“大”表上添加索引。使用 phpmyadmin 来执行此操作。 根据经验:仅索引 where 子句中的列/列(在您的情况下仅为 PostalCode)

      【讨论】:

        【解决方案4】:

        查看Adminer。它安装非常简单,可用于快速修改表的索引。

        您需要在 PostalCode 上创建一个索引,如果可能的话,您会希望 PostalCode 作为您的主键。

        如果您仍然遇到查询时间过长的问题,请尝试增加 Innodb_buffer_pool,使其足够大以包含完整的邮政编码表。

        【讨论】:

          【解决方案5】:

          最后,我直接从 mySQL 命令行在邮政编码上创建了索引:

          CREATE INDEX postal_index ON postalcode(postalcode);
          

          我对代码的搜索从 4.89 秒到 0.00 秒!!!!!!!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-28
            • 1970-01-01
            • 2021-12-01
            • 2014-10-10
            • 1970-01-01
            • 1970-01-01
            • 2019-01-04
            • 2013-01-31
            相关资源
            最近更新 更多