我正在使用 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 时,我的查询将返回超时错误。
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'。