【问题标题】:Index every field in a DB索引数据库中的每个字段
【发布时间】:2020-07-01 04:47:37
【问题描述】:

我有一个应用程序,其功能基本上类似于网格,用户可以在其中查看数据并按任何列进行排序/过滤。这是非常少量的数据(~200K 行 / 50MB),但太大而无法舒适地放入浏览器并在 javascript 中完成。

我想到的最粗略/最简单的方法是将其存储在 mysql 表中,并在每一列(是的,每个列)上都有一个索引。数据库/表大约有 99% 的读取/1% 的写入,所以如果插入时间增加 100 倍左右,我不太担心。

执行上述操作有什么缺点吗?我应该关注哪些类型的事情?有没有更好的(服务器端)方法来做这样的事情?

【问题讨论】:

  • 会占用更多空间。
  • @GordonLinoff 应该没问题——数据库大约 5MB,我想我有大约 100GB 的数据库,暂时除了这个应用程序之外没有其他用途。
  • 因为多列索引将有利于多个标准并逐级扩大问题空间,因此请注意慢查询并查看可以完成哪些多列值。幸运的是你有一个小数据集。
  • 索引在没有很多不同值的列上没有那么有效。只有几个不同值的列可能会更好地响应表扫描而不是索引。
  • 设置 long_query_time=0.05 并启用慢查询日志并查看查询 (pt-query-digest)。 General index principles - 索引的顺序很重要,例如范围之前的常量 ref (WHERE X=const) (X BETWEEN yconst AND zconst)。获取use EXPLAIN,您将很快掌握查询可以/不能使用的索引。

标签: mysql sql indexing database-design spreadsheet


【解决方案1】:

如果这些是“单词”,则将它们全部放入一列中,用空格分隔。然后在该列上添加一个 FULLTEXT 索引。如果您有其他非“单词”列,您可能还需要对它们进行索引。

警告:FULLTEXT 有几个限制。和好处(例如单数/复数)。

大概,除非进行一些过滤,否则您会拒绝显示任何内容?不要告诉我你想让用户在 200K 行中分页!

你还没有说他们是否可以过滤多个列。

您应该在您的应用代码中构造查询。全文的语法不同于相等和范围测试。

如果您对有问题的 EAV 架构设计感兴趣,请参阅 http://mysql.rjweb.org/doc.php/eav

我已经漫无目的了;如果你给我们一些关于数据和查询的线索,我可能会更加专注。

例子:

CREATE TABLE ... (
    ...
    all_words TEXT NOT NULL,
    LastUpdated DATETIME NOT NULL,
    ...
    FULLTEXT(all_words)
)

SELECT ...
    WHERE MATCH(all_words) AGAINST ('...' IN BOOLEAN MODE)
    ORDER BY LastUpdated DESC
    LIMIT 50;

(注意:由于只使用了一个索引,并且 FULLTEXT 具有优先级,LastUpdated 上的索引对于此示例将无用。)

【讨论】:

  • 感谢这些提示。我正在做类似FULLTEXT 的想法(结合所有列),但是这对排序有何作用?例如,我将有一个 LastUpdated 字段,用户可以查看 lastUpdated 的最后 50 个项目......所以他们可以排序的每一列并获得限制 50(如果他们真的可以分页到 1k 个结果想要 -- 20 页。)
  • @David542 - 我添加了一个例子。
猜你喜欢
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多