我有students
多對多關聯groups
通過連接表groups_students
。每個group
都有一個group_type
,它可以是permission_group
或不是(group_types
表上的布爾值)。MySQL關係部門查詢性能
我也有users
,這也是多對多與groups
通過groups_users
相關聯。
我要回:某一特定user
與所有學生的權限組相關聯的所有students
。
我已經導致相信這需要相關的部門,這裏是我與它其中:
SELECT DISTINCT gs.student_id
FROM groups_students AS gs
INNER JOIN groups ON groups.id = gs.group_id
INNER JOIN groups_users gu ON gu.group_id = groups.id
INNER JOIN group_types ON group_types.id = groups.group_type_id
WHERE group_types.permission_group = 1
AND gu.user_id = 37
AND NOT EXISTS (
SELECT * FROM groups_students AS gs2
WHERE gs2.student_id = gs.student_id
AND NOT EXISTS (
SELECT gu2.group_id
FROM groups_users AS gu2
WHERE gu2.group_id = gs2.group_id AND gu2.user_id = gu.user_id
)
)
這工作,但我在groups_students
超過20,000行實時的數據庫,它需要3秒。
我可以做得更快嗎?我讀了關於與COUNT
做關係部門,但我無法將其與我的情況。我能夠以低廉的收益在半秒的執行時間內完成這個查詢嗎?還是我正在尋找一個重大的重組?
編輯 - 英文描述:學生屬於班級(組),用戶有權查看某些班級。我需要知道特定用戶有權查看所有(許可)類的學生。
EXPLAIN
的慢查詢:
+----+--------------------+-------------+--------+--------------------------------------------------------------+--------------------------------------------------+---------+-----------------------------+------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------+--------+--------------------------------------------------------------+--------------------------------------------------+---------+-----------------------------+------+--------------------------------+
| 1 | PRIMARY | gu | ref | index_groups_users_on_user_id,index_groups_users_on_group_id | index_groups_users_on_user_id | 5 | const | 1181 | Using where; Using temporary |
| 1 | PRIMARY | groups | eq_ref | PRIMARY | PRIMARY | 4 | my_db.gu.group_id | 1 | |
| 1 | PRIMARY | group_types | ALL | PRIMARY | NULL | NULL | NULL | 3 | Using where; Using join buffer |
| 1 | PRIMARY | gs | ref | index_groups_students_on_group_id_and_student_id | index_groups_students_on_group_id_and_student_id | 4 | my_db.groups.id | 9 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | gs2 | ref | index_groups_students_on_student_id_and_group_id | index_groups_students_on_student_id_and_group_id | 4 | my_db.gs.student_id | 8 | Using where; Using index |
| 3 | DEPENDENT SUBQUERY | gu2 | ref | index_groups_users_on_user_id,index_groups_users_on_group_id | index_groups_users_on_group_id | 5 | my_db.gs2.group_id | 99 | Using where |
+----+--------------------+-------------+--------+--------------------------------------------------------------+--------------------------------------------------+---------+-----------------------------+------+--------------------------------+
去正規化和屬性添加權限組,以組 –
@SamD - 我試過,但它並沒有noticable差異的執行速度。問題出在嵌套的子查詢和大的'groups_students'連接表中。 –
17和18出現在您的結果中,但它們似乎不符合標準 – Strawberry