在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
可能会更好,因为它实际上是正确的命令。谢谢你指出这一点。