繁体   English   中英

在MySQL中为BIGINT列添加索引会有帮助吗?

[英]Would it help to add index to BIGINT column in MySQL?

我有一个表将有数百万个条目,并且一个列具有每行唯一的BIGINT(20)值。 它们不是主键,但在某些操作期间, WHERE子句中有数千个SELECT使用此列。

问:当条目数量增加到数百万时,为此列添加索引会有所帮助吗? 我知道它会用于文本值,但我不熟悉索引对INTBIGINT

将发生数千次的SELECT示例与此类似:

`SELECT * FROM table1 WHERE my_big_number=19287319283784

如果您有一个非常大的表,那么搜索未编制索引的值可能会非常慢。 在MySQL术语中,这种查询最终成为“表扫描”,这是一种说法,它必须依次对表中的每一行进行测试。 这显然不是最好的方法。

添加索引有助于提高读取速度,但您支付的价格略低于写入速度。 在进行优化时总是需要权衡,但在您的情况下,读取时间的缩短将是巨大的,而写入时间的增加将是微不足道的。

请记住,向大型表添加索引可能需要相当长的时间,因此在将生成数据应用到生产系统之前,请对其进行测试。 该表可能会在ALTER TABLE语句的持续时间内被锁定。

与往常一样,在查询中使用EXPLAIN来确定其执行策略。 在你的情况下,它是这样的:

EXPLAIN SELECT * FROM table1 WHERE my_big_number=19287319283784

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

我在亚马逊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;

至于inserts ,我可以用PHP做100 /秒,但是如果我将1000插入到一个数组中使用implode在同一个表上,我得到每秒3400个插入。 当然,您的数据不会以这种方式出现。 只是说服务器相对活泼。 但正如tadman建议的那样,并且他的意思是说EXPLAIN不会检查,在一个典型的语句前面看一下关键列是否显示将要使用的索引是你运行它。

普通的留言

对于慢速查询调试,将单词EXPLAIN放在单词select前面(无论select/join有多复杂 ),然后运行它。 虽然查询不会以正常方式运行并解析结果集,但db引擎将(几乎立即)生成它将尝试的执行计划。 运行真实查询时可以放弃此计划(将EXPLAIN置于其前面之前),但这是模式缺陷的主要线索。

EXPLAIN的输出对于那些第一次阅读的人来说显得神秘莫测。 不久。 在阅读了一些关于它的文章之后,例如使用EXPLAIN来编写更好的MySQL查询 ,通常可以确定查询的哪些部分正在使用哪些索引,使用none和执行慢速表格,更慢的where子句,派生表和临时表。

使用根据模式调整大小的EXPLAIN输出,您可以深入了解索引创建策略(例如composite索引和covering索引),以获得实质性的查询性能。

分享

分享此EXPLAIN输出和模式输出与他人(如计算器题) 关于性能更好的答案。 使用show create table myTableName等语句呈现模式输出。 谢谢你的分享。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM