我有以下查询,用于创建用户填写信息的百分比。我将其存储为 View ,但为 1500 个用户运行该查询大约需要 6 分钟。如何加快此查询速度?
它将用作每天在用户不活动时运行一次的查询。我们目前正在快速扩大我们的用户群,我只是担心 15,000 个用户会完全出错。
所以请 MySQL 大师,我请求你的帮助!
CREATE VIEW profile_check AS(
SELECT users.id,
FORMAT(( IF(
COUNT(users.firstname)+
COUNT(users.lastname)+
COUNT(users.gender)+
COUNT(users.country)+
COUNT(users.address_one)+
COUNT(users.city)+
COUNT(users.zipcode)+
COUNT(users.housenumber)+
COUNT(users.phonenumber)+
COUNT(users.educationlevel_id) = 10, 1, 0) +
IF(
COUNT(assesspassionresults.user_id) > 0, 1, 0) +
IF(
COUNT(assessmentcompetencyresults.user_id) > 0, 1, 0) +
IF(
COUNT(assessmentstrengthresults.user_id) > 0, 1, 0) +
IF(
SUM(CASE WHEN timelines.component_of = "employer" THEN 1 ELSE 0 END) > 0, 1, 0) +
IF(
SUM(CASE WHEN timelines.component_of = "individual" THEN 1 ELSE 0 END) > 0, 1, 0) +
IF(
COUNT(interests.user_id) > 0, 1, 0) +
IF(
COUNT(skills.user_id) > 0, 1, 0) +
IF(
COUNT(users_mediafiles.user_id) > 0, 1, 0) ) / 9 , 0) as profiel_check
FROM users
LEFT JOIN assesspassionresults
ON users.id = assesspassionresults.user_id
LEFT JOIN assessmentcompetencyresults
ON users.id = assessmentcompetencyresults.user_id
LEFT JOIN assessmentstrengthresults
ON users.id = assessmentstrengthresults.user_id
LEFT JOIN timelines
ON users.id = timelines.user_id
LEFT JOIN interests
ON users.id = interests.user_id
LEFT JOIN skills
ON users.id = skills.user_id
LEFT JOIN users_mediafiles
ON users.id = users_mediafiles.user_id
GROUP BY users.id);
解释
最佳答案
正如 MySQL 大师的建议,在所有 user_id 列上添加索引将解决我的性能问题。确实如此!
ALTER TABLE assesspassionresults ADD INDEX (user_id);
ALTER TABLE assessmentcompetencyresults ADD INDEX (user_id);
ALTER TABLE assessmentstrengthresults ADD INDEX (user_id);
ALTER TABLE timelines ADD INDEX (user_id);
ALTER TABLE skills ADD INDEX (user_id);
ALTER TABLE users_mediafiles ADD INDEX (user_id);
ALTER TABLE interests ADD INDEX (user_id);
关于mysql - 海量查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38009145/