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

在MySQL中向BIGINT列添加索引会有帮助吗?,mysql,performance,indexing,guid,Mysql,Performance,Indexing,Guid,我有一个包含数百万个条目的表,还有一个包含BIGINT(20)值的列,这些值对于每一行都是唯一的。它们不是主键,但在某些操作期间,有数千个SELECTs使用WHERE子句中的此列 Q:当条目数量增长到数百万条时,向该列添加索引是否会有所帮助?我知道对于文本值来说是这样的,但是我不知道索引对INT或BIGINT的作用 可能发生数千次的示例SELECT与此类似: `SELECT * FROM table1 WHERE my_big_number=19287319283784 它将提高查找(选择)性

我有一个包含数百万个条目的表,还有一个包含
BIGINT(20)
值的列,这些值对于每一行都是唯一的。它们不是主键,但在某些操作期间,有数千个
SELECT
s使用
WHERE
子句中的此列

Q:当条目数量增长到数百万条时,向该列添加索引是否会有所帮助?我知道对于文本值来说是这样的,但是我不知道索引对
INT
BIGINT
的作用

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

`SELECT * FROM table1 WHERE my_big_number=19287319283784

它将提高查找(选择)性能(基于示例查询),但也会降低插入/更新的速度。您的数据库大小也将增加。您需要查看您进行这些选择呼叫与插入呼叫的频率。如果您进行了大量的SELECT调用,那么这将提高您的整体性能。

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

添加索引将有助于提高读取速度,但您付出的代价是写入速度稍慢。在进行优化时总会有一个折衷方案,但在您的情况下,读取时间的减少将是巨大的,而写入时间的增加将是微乎其微的

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

一如既往,对查询使用
EXPLAIN
,以确定其执行策略。在你的情况下,应该是这样的:

EXPLAIN SELECT * FROM table1 WHERE my_big_number=19287319283784

我在AmazonEC2小实例上有一个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个插入塞进一个数组,我每秒可以插入3400个。当然,您的数据不是以这种方式提供的。只是说服务器相对快速。但是正如塔德曼所建议的,他想说的是
EXPLAIN
notexamine,在一个典型的语句前面,看看键列是否显示了一个索引,如果您运行它,它将被使用

一般性意见 对于慢速查询调试,请将单词
EXPLAIN
放在单词
select
前面(无论
select/join
多么复杂),然后运行它。虽然在解析resultset时查询不会以正常方式运行,但db引擎将(几乎立即)生成它将尝试的执行计划。当运行真正的查询时(将EXPLAIN放在前面之前的查询),这个计划可能会被放弃,但它是模式缺陷的主要线索

对于第一次阅读的人来说,
EXPLAIN
的输出看起来很神秘。不过不会太久。在阅读了一些关于它的文章之后,例如,我们通常能够确定查询的哪些部分正在使用哪些索引、使用none和执行slow tablescans、slow where子句、派生表和临时表

使用EXPLAIN的输出根据您的模式进行调整,您可以深入了解索引创建的策略(例如
复合
覆盖
索引),以获得显著的查询性能

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

这是否会对插入/更新造成巨大损害?这不仅是一个重读表,而且是一个重写表。最好的方法是实现它并进行一些分析以查看影响。通常读性能的提高要比写性能的提高大,但我不知道这对于一个沉重的写表来说是个好主意。我不熟悉EXAMINE,当我在Workbench中尝试它时,它不起作用,EXPLAIN是否执行了您希望使用的检查功能?
EXPLAIN
可能会更好,因为它实际上是正确的命令。谢谢你指出这一点。