php - MySQL针对数据表的优化和查询优化

标签 php mysql sql json query-optimization

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

  • 我正在调用一个 API,该 API 返回一个大的 json 编码字符串。
  • 我将带引号的编码字符串存储到 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 数据。

此表是一个事件存档。

我的一个想法是将标签放入它们自己的两列表中(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\":\"\"、\"类型\":\"照片\"、\"日期\":\"2013-09-24 00:36:56 GMT\",\"时间戳\":1379983016,\"状态\":\"已发布\",\"格式\":\"html\",\"reblog_key\":\"uLdTaScb\",\"标签\":[\"动漫\"、\"皮卡丘\"、\"新世纪的巨人\"、\"口袋妖怪\"、\"艾伦\"、\"进击的巨人\"]、\"short_url\":\"http:\\/\\/tmblr.co\\/ZxlLExvrzMen\",\"突出显示\":[],\"书签\":true,\"note_count\":19,\"source_url\":\"http:\\/\\/weheartit.com\\/entry\\/78231354\\/via\\/roxannegonzalez?page=2\",\"source_title\":\"weheartit.com\",\"标题\":\"\",\"link_url\":\"http:\\/\\/weheartit.com\\/entry\\/78231354\\/via\\/roxannegonzalez\",\"image_permalink\":\"http:\\/\\/roxannemariegonzalez.tumblr.com\\/image\\/62108559921\",\"照片\":[{\"标题\":\"\",\"alt_sizes\":[{\"宽度\":500,\"高度\":444,\"url\":\"http:\\/\\/31.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_500.png\"},{\"宽度\":400,\"高度\":355,\"url\":\"http:\\/\\/25.media.tumblr .com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_400.png\"},{\"宽度\":250,\"高度\":222,\"url\":\"http:\\/\\/31 .media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_250.png\"},{\"宽度\":100,\"高度\":89,\"url\":\"http:\\/\\/25.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_100.png\"},{\"宽度\":75,\"高度\":75,\"url\":\"http :\\/\\/25.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_75sq.png\"}],\"original_size\":{\"宽度\":500,\"高度\": 444,\"url\":\"http:\\/\\/31.media.tumblr.com\\/c8a87bee925b0b0674773af63e43f954\\/tumblr_mtltpkLvuo1qmfyxko1_500.png\"}}]}'

最佳答案

研究一下Mysql MATCH()/AGAINST()函数和FULLTEXT索引功能,这可能就是您正在寻找的。确保 FULLTEXT 索引能够在 json 文档上合理运行。

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

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

关于php - MySQL针对数据表的优化和查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19062882/

相关文章:

mysql - ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 将一些字符串保存到 mysql

sql - 数据库 |找到倍数(扭曲?!)

sql - Oracle 分层总和(叶到根的距离)

php - YII2 rest api url调用模型方法

php - 根据自定义字段和数量阈值更改 WooCommerce 购物车商品价格

php - 如何使用 FCM 使用 php 脚本向多个设备发送推送通知?

php - 来自 SQL 的 Laravel Eloquent ORM 聚合函数

php - mySQL 和 PHP 编码

php - MySQL SUM() 一个 ID(User) 的列的所有值 & echo total

干净的系统重新启动后 mySQL InnoDB 表损坏