【问题标题】:How should I use indexing in a very big table我应该如何在一个非常大的表中使用索引
【发布时间】:2018-08-22 08:00:28
【问题描述】:

假设我有下表,它可以包含 100M + 行。

表格示例

id           user_id          week    content                    created
========================================================================
1            100022312        1     <data to be searched>    <timestamp>
2            102232123        1     <data to be searched>    <timestamp>
...
10.000.000   126387126        1     <data to be searched>    <timestamp>
10.000.001   100022312        2     <data to be searched>    <timestamp>
10.000.002   102232123        2     <data to be searched>    <timestamp>
...
20.000.000   126387126        2     <data to be searched>    <timestamp>
....

第 3、4、5、6 周.....

我会这样查询表:

SELECT * FROM table WHERE week='2' AND content LIKE %word%

我的问题:

我可以使用索引来使这个查询运行得更快吗?怎么样?

有没有办法索引一行?我的意思是,我想为每周的第一行建立索引,以便下次选择时,它首先查看索引,匹配周数,然后在该批次中搜索。这意味着nr indexes == nr weeks

数据插入无关紧要。我也不需要任何排序。

我正在使用 MyISAM。

【问题讨论】:

  • 索引无法帮助LIKE '%word%'
  • 但您当然可以在week 上添加索引,这会有所帮助。
  • 好吧,假设我有cotent='word' 而不是LIKE %word%。你能告诉我如何添加索引吗?另外,您是否阅读了我的完整问题?我可以添加多少周(以及每周的第一行)的索引吗?

标签: mysql indexing scalability


【解决方案1】:

weekcontent 列上使用多列索引:

ALTER TABLE yourTable ADD INDEX (week, content);

如果您要在其中搜索文本,则字符串列上的索引将无济于事。但它有助于精确匹配和前缀匹配,如果你这样做content = 'word'content LIKE 'word%' 会很有用。

【讨论】:

  • 有什么方法可以查看我的表会创建多少索引?
  • 还有一件事(我是索引新手)。如果我有SELECT * FROM table WHERE week=2 AND number1=10 AND number2=20,我是否创建 3 列索引? ANDs 的数量是否会影响索引后的性能?
  • 听起来您需要阅读有关数据库索引如何工作的优秀教程。从How MySQL Uses Indexes开始
  • 我想也许你可以总结一下,这样我就不需要阅读文档了 :') 再次感谢。
  • 如果您可以索引AND 中的所有列,它将完全使用索引找到适当的行,而无需比较表中的任何数据。但是,索引过多可能会导致收益递减。索引占用空间。
【解决方案2】:

切换到content 上的FULLTEXT 索引。

【讨论】:

  • 综合考虑,我认为我目前的项目最好不使用任何索引。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多