Sao chép vào bảng tmp


15

Đây là ví dụ của tôi về truy vấn:

SELECT
    nickname, 
    CASE class_id
      WHEN 1 THEN 'Druid'
      WHEN 2 THEN 'Necromancer'
      WHEN 3 THEN 'Mage'
      WHEN 4 THEN 'Priest'
      WHEN 5 THEN 'Warrior'
      WHEN 6 THEN 'Stalker'
      WHEN 7 THEN 'Paladin'
      WHEN 8 THEN 'Psionic'
    END class_name,
    ROUND(AVG(level),2) level,
    ROUND(AVG(tabard_id),2) tabard,
    CASE rank_id
      WHEN 1 THEN 'Leader'
      WHEN 2 THEN 'Officer'
      WHEN 3 THEN 'Veteran'
      WHEN 4 THEN 'HonoryMember'
      WHEN 5 THEN 'OrdinaryMember'
      WHEN 6 THEN 'Alt'
      WHEN 7 THEN 'Apprentice'
      WHEN 8 THEN 'Penalty'
    END rank_name,
    ROUND(AVG(loyality),2) loyality,
    ROUND((MAX(authority)-MIN(authority))/AVG(tabard_id)) authority_effective,
    MAX(authority)-MIN(authority) authority_delta,
    MIN(authority) authority_begin,
    MAX(authority) authority_end
FROM users
    LEFT JOIN level_history ON level_history.users_id = users.id
    LEFT JOIN tabard_history ON tabard_history.users_id = users.id
    LEFT JOIN rank_history ON rank_history.users_id = users.id
    LEFT JOIN loyality_history ON loyality_history.users_id = users.id
    LEFT JOIN authority_history ON authority_history.users_id = users.id
    LEFT JOIN guilds_has_users ON guilds_has_users.users_id = users.id
    LEFT JOIN report ON report.id = authority_history.report_id
      AND report.id = level_history.report_id
      AND report.id = loyality_history.report_id
      AND report.id = rank_history.report_id
      AND report.id = tabard_history.report_id
WHERE report.date BETWEEN '2011-10-24 00:00:00' AND '2011-10-30 23:59:59'
  AND guilds_has_users.active = 1
GROUP BY users.id;

Giải thích về lựa chọn đó:

id  select_type   table               type    possible_keys                                            key                          key_len   ref                                           rows    Extra
1   SIMPLE        guilds_has_users    ref     fk_guilds_has_users_users1,active_IDX                    active_IDX                   1         const                                         139     Using where; Using temporary; Using filesort
1   SIMPLE        users               eq_ref  PRIMARY                                                  PRIMARY                      4         z92985_orlandino.guilds_has_users.users_id    1    
1   SIMPLE        level_history       ref     fk_level_history_users1,fk_level_history_report1,u...    fk_level_history_users1      4         z92985_orlandino.guilds_has_users.users_id    1       Using where
1   SIMPLE        report              eq_ref  PRIMARY,date_IDX,id_date_IDX                             PRIMARY                      4         z92985_orlandino.level_history.report_id      1       Using where
1   SIMPLE        tabard_history      ref     fk_tabard_history_users1,fk_tabard_history_report1...    fk_tabard_history_users1     4         z92985_orlandino.level_history.users_id       1       Using where
1   SIMPLE        rank_history        ref     fk_rank_history_users1,fk_rank_history_report1,use...    fk_rank_history_users1       4         z92985_orlandino.users.id                     1       Using where
1   SIMPLE        loyality_history    ref     fk_loyality_history_users1,fk_loyality_history_rep...    fk_loyality_history_users1   4         z92985_orlandino.rank_history.users_id        1       Using where
1   SIMPLE        authority_history   ref     fk_authority_history_users1,fk_authority_history_r...    fk_authority_history_users1  4         z92985_orlandino.level_history.users_id       1       Using where

Hồ sơ của lựa chọn đó cho tôi biết:

(139 total, Query took 4.4918 sec)
Copying to tmp table 4.488318

Và một số thông tin về các biến MySQL:

SHOW VARIABLES LIKE '%buffer%';

Variable_name              Value
bulk_insert_buffer_size    8388608
join_buffer_size           131072
key_buffer_size            12884901888
myisam_sort_buffer_size    8388608
net_buffer_length          16384
preload_buffer_size        32768
read_buffer_size           131072
read_rnd_buffer_size       25165824
sort_buffer_size           2097144
sql_buffer_result          OFF

Tại sao sao chép vào bảng tmp rất chậm? Làm thế nào để cải thiện tốc độ truy vấn của tôi?

PS: Tôi không thể cấu hình MySQL vì nhà cung cấp dịch vụ lưu trữ của tôi sẽ không cho phép.

Câu trả lời:


22

Bạn có thể cần thử đặt một số biến nhất định trong phiên của mình

Các giá trị cụ thể này có thể quá nhỏ để Kết nối DB của bạn thực hiện truy vấn hiệu quả. Chúng có thể được đặt trong vòng như sau:

  • Để xem những giá trị nào các cài đặt này hiện đang làm như sau:
    • SHOW VARIABLES LIKE 'max_heap_table_size';
    • SHOW VARIABLES LIKE 'tmp_table_size';
  • Để đặt max_heap_table_size thành 64M, hãy làm như sau:
    • SET max_heap_table_size = 1024 * 1024 * 64;
  • Để đặt tmp_table_size thành 32M, hãy làm như sau:
    • SET tmp_table_size = 1024 * 1024 * 32;

Vui lòng tham khảo Tài liệu MySQL về Sử dụng Bảng Temp

Nếu bạn không thể đặt các giá trị này trong phiên của riêng mình, hãy liên hệ với nhà cung cấp dịch vụ lưu trữ của bạn để tự động đặt chúng trong my.cnf của bạn.

Hãy thử một lần !!!


+1 để đặt các biến trong phiên, chắc chắn nó có thể giúp truy vấn này, có vẻ khá phức tạp ...
Dave Rix

5

Bạn có thể giảm truy vấn chỉ những bảng đó hoàn toàn cần thiết để tạo đầu ra của bạn hoặc chia truy vấn thành nhiều truy vấn riêng biệt để lấy ra các phần khác nhau của thông tin không?

Bạn cũng có thể thấy rằng việc chạy ba truy vấn riêng biệt trên dữ liệu của mình sẽ nhanh hơn chạy một truy vấn lớn - đặc biệt là khi cơ sở dữ liệu của bạn bắt đầu tăng lên hàng chục và hàng trăm nghìn hàng.

Tôi cũng nhận thấy từ công việc của mình rằng LEFT JOINcác truy vấn không nhất thiết phải hiệu quả nhất, vì vậy chỉ sử dụng chúng khi thực sự cần thiết ...

Mong rằng sẽ giúp :)


1
Đôi khi các truy vấn nhỏ hơn có ý nghĩa hơn một khối lượng lớn các bảng và TRÁI PHIẾU (Ví dụ: stackoverflow.com/questions/5983156/ trộm ) +1 !!!
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.