【问题标题】:MySQL Optimization for data tables and Query optimizationMySQL 数据表优化和查询优化
【发布时间】:2013-09-28 03:23:57
【问题描述】:

这里有很多细节,我的主要目标是尽快完成。

  • 我正在调用一个返回大型 json 编码字符串的 API。
  • 我将引用的编码字符串存储到 MySQL (InnoDB) 中,其中包含 3 个字段:(tid (key), json, tags) 在名为 store 的表中。
  • 最多 3 个月后,我将使用以下方法从该数据库中提取信息:

    WHERE tags LIKE "%something%" AND "%somethingelse%" 
    
  • 标签用 + 分隔。 (这使得它们太长而无法有效地键入。) 示例:

    'anime+pikachu+shingeki no kyojin+pokemon+eren+attack on titan+'
    
  • 我不想在任何时候重复 API 调用。如果您要包含 API 调用,请使用:

    API(tag, time);
    

需要所有 JSON 数据。

此表是一个活动存档。

我的一个想法是将标签放入它们自己的 2 列表(pid、标签(键))中。 pid 指向store 表中的 tid。

问题

  1. 是否可以更改任何 MySQL 配置以加快速度?
  2. 是否可以更改表结构以加快速度?
  3. 我还能做些什么来加快速度吗?

引用的 JSON 示例(混乱,要查看另一个干净的示例,请参阅 TUMBLR APIv2): '{\"blog_name\":\"roxannemariegonzalez\",\"id\":62108559921,\"post_url\":\"http:\\/\\/roxannemariegonzalez.tumblr.com\\/post\\/62108559921\",\"slug\":\"\",\"type\":\"photo\",\"date\":\"2013-09-24 00:36:56 GMT\",\"timestamp\":1379983016,\"state\":\"published\",\"format\":\"html\",\"reblog_key\":\"uLdTaScb\",\"tags\":[\"anime\",\"pikachu\",\"shingeki no kyojin\",\"pokemon\",\"eren\",\"attack on titan\"],\"short_url\":\"http:\\/\\/tmblr.co\\/ZxlLExvrzMen\",\"highlighted\":[],\"bookmarklet\":true,\"note_count\":19,\"source_url\":\"http:\\/\\/weheartit.com\\/entry\\/78231354\\/via\\/roxannegonzalez?page=2\",\"source_title\":\"weheartit.com\",\"caption\":\"\",\"link_url\":\"http:\\/\\/weheartit.com\\/entry\\/78231354\\/via\\/roxannegonzalez\",\"image_permalink\":\"http:\\/\\/roxannemariegonzalez.tumblr.com\\/image\\/62108559921\",\"photos\":[{\"caption\":\"\",\"alt_sizes\":[{\"width\":500,\"height\":444,\"url\":\"http:\\/\\/31.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_500.png\"},{\"width\":400,\"height\":355,\"url\":\"http:\\/\\/25.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_400.png\"},{\"width\":250,\"height\":222,\"url\":\"http:\\/\\/31.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_250.png\"},{\"width\":100,\"height\":89,\"url\":\"http:\\/\\/25.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_100.png\"},{\"width\":75,\"height\":75,\"url\":\"http:\\/\\/25.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_75sq.png\"}],\"original_size\":{\"width\":500,\"height\":444,\"url\":\"http:\\/\\/31.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_500.png\"}}]}'

【问题讨论】:

    标签: php mysql sql json query-optimization


    【解决方案1】:

    查看 Mysql MATCH()/AGAINST() 函数和 FULLTEXT 索引功能,这可能是您正在寻找的。确保 FULLTEXT 索引将在 json 文档上合理运行。

    我们在谈论什么样的数据大小?如今,大量内存很便宜,因此将整个 Mysql 数据集缓冲在可以进行全文扫描的内存中并不是不合理的。

    拆分一些 json 字段值并将它们放入自己的列中可以让您快速搜索那些...但这对一般情况没有帮助。

    【讨论】:

    • 谢谢,我不需要搜索 json 值,只需搜索标签。我如何将数据集缓冲到内存中?索引不会在 json 本身上运行,而是在 tags 字段上运行,如果全文索引可以加快速度,我会实现。
    • 好的,我明白了,json 不会成为搜索的一部分。所以全文绝对应该有效。缓冲是指 Mysql 自动执行的操作:它使用服务器的 ram 缓存所有内容(告诉 Mysql 它可以在 my.cnf 中使用多少 ram),因此您的查询速度很快。
    【解决方案2】:

    您建议的这个选项是正确的设计:

    我的一个想法是将标签放入他们自己的 2 列表(pid, 标签(键))。 pid 指向 store 表中的 tid。

    但是,如果您搜索 LIKE '%something%',那么前导 '%' 将意味着索引只能用于减少磁盘读取 - 您仍然需要扫描整个索引。 如果您可以删除前导 % (因为您现在拥有整个标签),那么这肯定是要走的路。尾随的 '%' 没有那么重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多