【问题标题】:MySQL - my View is very slowMySQL - 我的视图很慢
【发布时间】:2017-05-07 11:43:31
【问题描述】:

我有 4 张桌子:

  • 学生 with over 7000 records
  • 教师 with over 600 records
  • 大学 with over 30 records
  • Lessons_Meta with over 10000 records

学生列:

id | student_number | name


Teachers 列:

id | teacher_number | name


大学列:

id | name


Lessons_Meta 列:

id | lesson_code | lesson_name | student_id | teacher_id | university_id


我的看法是:

CREATE VIEW `view_lessons` AS
SELECT
        *,
        (SELECT `name` FROM `students` WHERE `students`.`id` = `lessons_meta`.`student_id` LIMIT 1) AS "student_name",
        (SELECT `name` FROM `teachers` WHERE `teachers`.`id` = `lessons_meta`.`teacher_id` LIMIT 1) AS "teacher_name",
        (SELECT `name` FROM `universities` WHERE `universities`.`id` = `lessons_meta`.`university_id` LIMIT 1) AS "university_name"
FROM `lessons_meta`


我的查询是:

SELECT * FROM `view_lessons` LIMIT 20

20 秒后,显示此查询已完成!我怎样才能减少这个时间负载?

【问题讨论】:

    标签: mysql join view


    【解决方案1】:

    您可能只需要索引。从以下索引开始:

    CREATE INDEX idx_students_id_name ON students(id, name);
    CREATE INDEX idx_teachers_id_name ON teachers(id, name);
    CREATE INDEX idx_universities_id_name ON universities(id, name);
    

    【讨论】:

    【解决方案2】:

    将您的视图更改为此

    CREATE VIEW `view_lessons` AS
    SELECT L.*,  S.`name` AS student_name, T.`name` AS teacher_name, U.`name` AS university_name
    FROM `lessons_meta` L
    INNER JOIN `students` S ON S.`id` = L.`student_id`
    INNER JOIN `teachers` T ON T.`id` = L.`teacher_id` 
    INNER JOIN `universities` U ON U.`id` = L.`university_id`
    
    • lessons_meta 表中,在student_idteacher_iduniversity_id 上添加索引
    • 在所有表上,确保 id 列被正确索引,通常它们应该是唯一的/PK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多