mysql - 海量查询优化

标签 mysql query-optimization

我有以下查询,用于创建用户填写信息的百分比。我将其存储为 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);

解释

enter image description here

最佳答案

正如 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/

相关文章:

mysql - 优化 GROUP_CONCAT 查询

mysql查询,在查询中使用列名

mysql - 查询在本地主机上运行良好,但在我们的服务器上非常慢

java - 是否推荐使用aerospike对某些字段进行过滤

mysql - .Net 与 MySQL : ignore parameters in commandtext

mysql - phpMyAdmin,有什么东西可以添加到 sql 来关闭该查询的缓存吗?

java - 在 java.util.ArrayList 或 SQL 中执行 "Optimized"set 操作

php - MySQL:分组并计算多个字段

c# - 如何将数据插入到特定行 MySQL C#

python - Flask_mysql 给出错误 "ExtDeprecationWarning: Detected extension named flaskext.mysql please rename it to flask_mysql."