查询3张表,返回32条记录,耗时11秒。如何改进查询?

问题描述 投票:0回答:1

我正在使用 PHP 和 WordPress 进行数据库查询。 在下面的查询中,返回结果的时间太长。 (总共 32 个,查询耗时 11.4666 秒。) 当结果计数超过 500 时,数据库服务器返回超时错误。

有没有更好的方法可以查询3个表?

架构如下: 笔记表 创建日期 修改日期 笔记作者 注释文本 联系人_id

用户元表 用户身份 元键 元值

用户 ID(这是usermeta表中的user_id) 用户邮箱

SELECT note.date_created as date_created,
 note.date_modified as date_modified,
 firstname.meta_value as first_name, 
 lastname.meta_value as last_name,
 useremail.user_email as email,
 note.note_author as author,
 note.note_text as note,
 userid.user_id 
FROM `notes` as note 
LEFT JOIN usermeta AS userid 
 ON note.contact_id = userid.meta_value 
LEFT JOIN users as useremail 
 ON userid.user_id = useremail.ID 
LEFT JOIN usermeta AS firstname 
 ON userid.user_id = firstname.user_id 
LEFT JOIN usermeta AS lastname
 ON userid.user_id = lastname.user_id 
WHERE userid.meta_key = 'activecampaign_contact_id'
 AND firstname.meta_key = 'first_name' 
 AND lastname.meta_key = 'last_name' 
 AND note.contact_id = 80426;

我想提高查询的性能,以便它可以处理数千条记录。 现在,当结果超过 500 时,我的查询将返回超时错误。

sql mysql database query-optimization
1个回答
0
投票

EAV 是一种难以优化的模式模式。

表格似乎过度标准化。 (无需将名称的各个部分拆分到多个表中。)

这些综合指数会有所帮助。

firstname:  INDEX(meta_key, user_id,  meta_value)
lastname:  INDEX(meta_key, user_id,  meta_value)
userid:  INDEX(meta_key, meta_value,  user_id)

如果

meta_value
TEXT
,请将其从索引中删除。

如果

note.contact_id
VARCHAR
,请引用 `'80426'。

© www.soinside.com 2019 - 2024. All rights reserved.