【问题标题】:Wordpress and mysql : Issue with triggerWordpress 和 mysql:触发器问题
【发布时间】:2023-04-02 05:58:01
【问题描述】:

对不起,如果我发错地方了,我是法国人(对不起,我修改了谷歌翻译),通常我仍然可以管理,但我在这个问题上咬牙切齿。

我正在使用 WordPress、MySQL 和一个名为 WP-member 的成员管理插件。我修改了插件,使用户能够输入他的邮政编码。

问题在于,使用 WordPress,所有有关用户的信息都存储在 usermeta 表中。

这是表的结构: umeta_id(pk):不是用户id而是注册id,可以是用户名、邮编等。多个umeta_id可以与用户id关联。

user_id(fk): 是用户的id,在另一个表中是pk但是另一个表不能存储我想要的数据,因为该表在WordPress下是不可修改的。

meta_key:是数据的标题,例如姓名、邮政编码。所以我们可以为不同的用户找到多次相同的meta_key。

meta_value:对 meta_key 的回答,这是它找到保存数据的地方。

简化用户示例:

umeta_id | user_id | meta_key   | meta_value
-----------------------------------------------------------------
1        |   1     | name        | Toto

2        |   1     | postcode    | 66000

...      |   1     | ...         | ...

15       |   1     | city        | Perpignan

这种结构的问题在于,我认为用户积累的越多,检索邮政编码的请求就越长。

因为一个用户可以有 15 种不同的录音。如果有 10000 个用户,将有 150000 行来检索我们想要的邮政编码。我想听听你的意见,因为我认为这张表的结构有问题。

所以我想创建一个新的用户表,其结构看起来像这样(我不需要城市),以方便查询和响应时间。

user_id | name  | postcode
-----------------------------------
   1    | toto  | 66000

表的创建不用担心,关于通过表usermeta的触发器实现它我只能得到user_id和名称,这要归功于new.user_id的调用,但我无法检索zip代码。下面触发:

insert into users (user_id, name, codepostal) values ​​(
   (select distinct user_id from usermeta where user_id = new.user_id),
   (select meta_value from te_usermeta where meta_key = 'name' and user_id = new.user_id),
   (select meta_value from te_usermeta where meta_key = 'codepostal' and user_id = new.user_id)
 )

我告诉自己更新会更糟。有人可以指导我吗?提前谢谢你。

【问题讨论】:

  • 所以你假设它会很慢并且想要改变关于 wordpress 如何工作的一个非常基本的事情(EAV 模型在 wordpress 中被大量使用)。你可能不应该那样做。特别是如果您只检索单个信息,EAV(具有适当的索引)不应该比您的其他查询慢。此外,150k 行实际上并没有太多数据,可能会累积到一些 MB,这将很好地适合您的缓存/内存(通常以 GB 为单位)。如果它很慢,你应该添加一些细节(特别是explain yourquery的输出,你可能会丢失索引)。
  • 你好 Solarflare 我用一个问题来回答我的问题

标签: mysql wordpress insert sql-update database-trigger


【解决方案1】:

我不知道,但在另一个网站上,他们给了我这个触发器:

CREATE TRIGGER `ajouter`
BEFORE insert ON `tabone`
FOR EACH ROW
BEGIN
  DECLARE _name         VARCHAR(255)  DEFAULT NULL;
  DECLARE _postcode  INTEGER       DEFAULT NULL;

  SET _name        = (select name        from `tabtwo` where user_id = new.user_id);
  SET _postcode = (select postcode from `tabtwo` where user_id = new.user_id);

  IF new.meta_key = 'name'        then replace into `tabtwo` (`user_id`,`name`,`postcode`) values (new.user_id, new.meta_value,_postcode); END IF;
  IF new.meta_key = 'postcode' then replace into `tabtwo` (`user_id`,`name`,`postcode`) values (new.user_id,_name,new.meta_value);         END IF;

它有效。

对使用索引优化的新表的查询会比对非结构化 wordpress EAV 模型的表的查询慢吗?

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2014-11-29
    • 2013-12-06
    相关资源
    最近更新 更多