在MySQL中,对BIGINT列添加索引是否有帮助?

6

我有一个表将拥有数百万条记录,其中一列包含每行唯一的BIGINT(20)值。它们不是主键,但在某些操作中,在WHERE子句中使用此列进行了数千次SELECT

问:当记录数量增长到数百万条时,给该列添加索引是否有帮助?我知道对于文本值,这将有所帮助,但我不熟悉索引对于INTBIGINT的作用。

类似于以下示例SELECT将会重复数千次:

`SELECT * FROM table1 WHERE my_big_number=19287319283784
3个回答

7
如果您有一个非常大的表格,则对未索引的值进行搜索可能会非常缓慢。在MySQL术语中,这种查询最终将成为“表扫描”,也就是说它必须按顺序测试表中的每一行。显然这不是最好的方法。
添加索引可以提高读取速度,但您需要付出稍微降低写入速度的代价。在进行优化时总会有权衡,但在您的情况下,读取时间的减少将是巨大的,而写入时间的增加则是微不足道的。
请记住,在大型表格中添加索引可能需要相当长的时间,因此在应用于生产系统之前,请对生产数据进行测试。在ALTER TABLE语句的持续时间内,该表格很可能会被锁定。
与往常一样,使用EXPLAIN来确定您的查询的执行策略。在您的情况下,它可能是这样的:
EXPLAIN SELECT * FROM table1 WHERE my_big_number=19287319283784

我不熟悉EXAMINE,在Workbench中尝试时它无法工作,你是否打算使用EXPLAIN来实现EXAMINE的功能? - Indigenuity
1
“EXPLAIN”可能效果更好,因为它实际上是正确的命令。感谢您指出这一点。 - tadman

1

我在亚马逊EC2小实例上拥有一个2200万行的表格。因此,它远远不是最快的服务器环境。我已经创建了以下内容:

CREATE TABLE huge
(
    myid int not null AUTO_INCREMENT PRIMARY KEY,
    version int not null,
    mykey char(40) not null,
    myvalue char(40) not null,
    productid int not null
);

CREATE INDEX prod_ver_index ON huge(productid,version);

这个调用立即完成:

select * from huge where productid=3333 and version=1988210878;

关于插入,我可以在PHP中做到每秒100次,但是如果我将1000个插入语句压缩到一个数组中,使用同一张表的implode函数,则每秒可以得到3400个插入。自然而然,您的数据不是以这种方式进入的。只是说服务器相对较快。但正如tadman建议的那样,他想说的是在典型语句前面加上EXPLAIN而不是examine,以查看键列是否显示出将要被使用的索引。

一般评论

针对慢查询调试,在select单词前面放置EXPLAIN(无论select/join有多么复杂),并运行它。虽然查询不会按照正常方式运行以解决结果集,但数据库引擎会立即生成其尝试的执行计划。当运行真实查询(在将EXPLAIN放在其前面之前)时,可能会放弃该计划,但这是一个主要的指示不足之处。

EXPLAIN 的输出对于初次接触的人来说可能会显得晦涩难懂。但不用担心,只要阅读一些相关文章,比如使用 EXPLAIN 编写更好的 MySQL 查询,通常就能够确定查询中哪些部分正在使用哪些索引、哪些没有使用索引而进行了缓慢的表扫描、哪些 where 子句较慢、哪些是派生表和临时表。

通过将 EXPLAIN 的输出与您的模式进行比较,您可以深入了解索引创建策略(例如复合索引和覆盖索引),从而获得大量的查询性能提升。

分享

与他人分享此 EXPLAIN 输出和模式输出(例如在 stackoverflow 问题中)可以加快有关性能的更好答案的到来。模式输出是通过诸如 show create table myTableName 这样的语句呈现的。感谢您的分享。


1

这将提高您的查找(SELECT)性能(基于您的示例查询),但也会使您的插入/更新变慢。您的数据库大小也会增加。您需要查看您进行这些SELECT调用与INSERT调用的频率。如果您进行了大量的SELECT调用,则应该改善您的整体性能。


这会对插入/更新造成很大的损害吗?这不仅是一个读取压力大的表,而且还是一个写入压力大的表。 - Indigenuity
最好的方法是实现它并进行一些分析以查看其影响。通常,读取性能的提高大于写入性能的降低,但我不知道对于一个频繁写入的表格来说是否是个好主意。 - Oleksi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接