我有一个表将拥有数百万条记录,其中一列包含每行唯一的BIGINT(20)
值。它们不是主键,但在某些操作中,在WHERE
子句中使用此列进行了数千次SELECT
。
问:当记录数量增长到数百万条时,给该列添加索引是否有帮助?我知道对于文本值,这将有所帮助,但我不熟悉索引对于INT
或BIGINT
的作用。
类似于以下示例SELECT
将会重复数千次:
`SELECT * FROM table1 WHERE my_big_number=19287319283784
我有一个表将拥有数百万条记录,其中一列包含每行唯一的BIGINT(20)
值。它们不是主键,但在某些操作中,在WHERE
子句中使用此列进行了数千次SELECT
。
问:当记录数量增长到数百万条时,给该列添加索引是否有帮助?我知道对于文本值,这将有所帮助,但我不熟悉索引对于INT
或BIGINT
的作用。
类似于以下示例SELECT
将会重复数千次:
`SELECT * FROM table1 WHERE my_big_number=19287319283784
EXPLAIN SELECT * FROM table1 WHERE my_big_number=19287319283784
我在亚马逊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
这样的语句呈现的。感谢您的分享。
这将提高您的查找(SELECT)性能(基于您的示例查询),但也会使您的插入/更新变慢。您的数据库大小也会增加。您需要查看您进行这些SELECT调用与INSERT调用的频率。如果您进行了大量的SELECT调用,则应该改善您的整体性能。