0

所以这里有很多细节,我的主要目标是尽可能快地做到这一点。

  • 我正在调用一个返回大型 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\"}}]}'

4

2 回答 2

0

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

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

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

于 2013-09-28T04:05:46.350 回答
0

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

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

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

于 2013-09-28T06:34:49.440 回答