【问题标题】:Faster selects when using GUID vs. Select WHERE?使用 GUID 与选择 WHERE 时选择更快?
【发布时间】:2012-09-03 13:47:55
【问题描述】:

我有一张包含数千条记录的表。我做了很多这样的选择来查找一个人是否存在。

SELECT * from person WHERE personid='U244A902'

因为个人ID不是纯数字,所以我没有用它作为主键,而是自增。但现在我正在重新考虑我的策略,因为我认为SELECTS 会随着桌子填满而变慢。我在想这种缓慢背后的原因是因为personid 不是主键。

所以我的问题是,如果我要通过重组表的麻烦并使用personid 作为主键而不是自动增量,那会显着加快选择速度吗?我说的是现在有 200,000 条记录的表,完成后将填充约 500 万条记录。

【问题讨论】:

    标签: mysql database query-optimization


    【解决方案1】:

    速度慢间接是因为personid 不是主键,因为它没有被索引,因为它没有被定义为键。最快的解决方法是简单地对其进行索引:

    CREATE UNIQUE INDEX `idx_personid` ON `person` (`personid`);
    

    但是,如果它是唯一值,它应该是表的主键。没有真正需要单独的auto_increment 密钥。

    ALTER TABLE person DROP the_auto_increment_column;
    ALTER TABLE person ADD PRIMARY KEY personid;
    

    但是请注意,如果您还在其他表中使用the_auto_increment_column 作为FOREIGN KEY 并将其删除以支持personid,则您需要修改所有其他表以使用personid。这样做的困难可能并不完全值得你获得。

    【讨论】:

    • @sameold 不要太担心空间问题。希望您的personid 列的长度与VARCHAR() 一样长。对于数百万行,存储一个短字符串而不是一个 int 只会增加几百兆字节。
    【解决方案2】:

    您可以为 personid 创建一个索引。

    CREATE INDEX id_index ON person(personidid)
    

    【讨论】:

      【解决方案3】:
      ALTER TABLE `person ` ADD INDEX `index1` (`personid`);
      

      尝试索引您使用 where 子句或选择列的列

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 2015-06-03
        • 2011-09-27
        • 2013-11-12
        • 2012-02-19
        • 1970-01-01
        相关资源
        最近更新 更多