我应该在经常获得新行的MySQL表上放置索引吗?

时间:2014-01-28 14:46:04

标签: mysql indexing

我正在创建一个表格,用于跟踪访问网站时使用的某些关键字。目前,该表非常简单:

id (INT, 11, unsigned, primary key, auto_inc)
keyword (VARCHAR, 32)
hits (INT, 10, unsigned)

每次用户点击网站时,我们都会从他们的HTTP_REFERER中提取一系列关键字,然后在表格中对这些关键字进行计数。如果关键字已经存在于表中,那么我们hits++,如果没有,那么我们会插入一个hits=1的新行。

一切都非常简单,问题是,我应该在桌面上设置keyword索引吗?从我读到的一个列开始,一个不断添加新行的索引不会有助于提高性能,因为INSERTS变得慢得多。将不可避免地存在大量INSERTS,因此通过减慢插入速度,更快更新所发现的性能增益是否会超过?如果这个表最终可能是~100k行,那么索引是否有益?我们平均每分钟有4个查询,因此负载不会很高。

这个问题非常具有假设性,但如果不将其置于活载状态下加载测试并不容易,我不想让它失明。

1 个答案:

答案 0 :(得分:1)

绝对。实际上,您需要unique索引:

create unique index keywords_keyword on keywords(keyword);

您希望这样做的原因是您可以使用insert . . . on duplicate key updateinsert代码如下所示:

insert into keywords(keyword, hits)
    select YOURKEYWORD, 0
    on duplicate key update hits = hits + 1;

添加索引的开销可能甚至不会使插入更长。通过索引,MySQL可以轻松确定表中是否已存在关键字。没有索引,它必须进行全表扫描。全表扫描可能比维护索引花费更多时间。

编辑:

如果您有多个关键字,则可以构建如下查询:

insert into keywords(keyword, hits)
    select YOURKEYWORD1 as keyword, 0 as hits union all
    select YOURKEYWORD2 as keyword, 0 as hits union all
    select YOURKEYWORD3 as keyword, 0 as hits
    on duplicate key update hits = hits + 1;