Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Penalti kinerja untuk kueri mysql bersarang

Jawaban atas pertanyaan ini bergantung pada apakah Anda menggunakan mysql sebelum 5.7, atau 5.7 dan setelahnya. Saya mungkin sedikit mengubah pertanyaan Anda, tetapi semoga pertanyaan berikut dapat menangkap apa yang Anda cari.

SELECT * FROM Table melakukan pemindaian tabel melalui indeks berkerumun (pemesanan fisik). Jika tidak ada kunci utama, salah satunya adalah secara implisit tersedia untuk mesin. Tidak ada klausa di mana seperti yang Anda katakan. Tidak ada penyaringan atau pilihan indeks lain yang dicoba.

Jelaskan keluaran (lihat juga ) menunjukkan 1 baris dalam ringkasannya. Ini relatif lurus ke depan. Jelaskan output dan kinerja dengan tabel turunan Anda B akan berbeda tergantung pada apakah Anda menggunakan versi sebelum 5.7, atau 5.7 dan setelahnya.

Dokumen Tabel Turunan di MySQL 5.7 menjelaskannya dengan baik untuk versi 5.6 dan 5.7, di mana yang terakhir tidak akan memberikan penalti karena perubahan dalam output tabel turunan terwujud yang dimasukkan ke dalam kueri luar. Di versi sebelumnya, overhead yang substansial ditanggung dengan tabel sementara dengan turunan.

Cukup mudah untuk menguji penalti kinerja sebelum 5.7. Yang diperlukan hanyalah tabel berukuran sedang untuk melihat dampak nyata yang dimiliki tabel turunan pertanyaan Anda dalam memengaruhi kinerja. Contoh berikut ada di meja kecil di versi 5.6:

explain 
select qm1.title  
from questions_mysql qm1 
join questions_mysql qm2 
on qm2.qid<qm1.qid 
where qm1.qid>3333 and qm1.status='O';
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| id | select_type | table | type  | possible_keys   | key     | key_len | ref  | rows  | Extra                                          |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
|  1 | SIMPLE      | qm1   | range | PRIMARY,cactus1 | PRIMARY | 4       | NULL |  5441 | Using where                                    |
|  1 | SIMPLE      | qm2   | ALL   | PRIMARY,cactus1 | NULL    | NULL    | NULL | 10882 | Range checked for each record (index map: 0x3) |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+


explain 
select b.title from 
(   select qid,title from questions_mysql where qid>3333 and status='O' 
) b 
join questions_mysql qm2 
on qm2.qid<b.qid; 
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| id | select_type | table           | type  | possible_keys   | key     | key_len | ref  | rows  | Extra                                              |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
|  1 | PRIMARY     | qm2             | index | PRIMARY,cactus1 | cactus1 | 10      | NULL | 10882 | Using index                                        |
|  1 | PRIMARY     | <derived2>      | ALL   | NULL            | NULL    | NULL    | NULL |  5441 | Using where; Using join buffer (Block Nested Loop) |
|  2 | DERIVED     | questions_mysql | range | PRIMARY,cactus1 | PRIMARY | 4       | NULL |  5441 | Using where                                        |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+

Catatan, saya memang mengubah pertanyaan, tetapi ini menggambarkan dampak tabel turunan dan kurangnya penggunaan indeks dengan pengoptimal dalam versi sebelum 5.7. Tabel turunan mendapat manfaat dari indeks saat sedang terwujud. Tapi setelah itu bertahan di atas kepala sebagai tabel sementara dan dimasukkan ke dalam kueri luar tanpa menggunakan indeks. Ini tidak terjadi di versi 5.7




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL from_unixtime setelah 2038-01-19?

  2. Mengabaikan tahun dalam SQL Query dengan rentang tanggal

  3. Bagaimana saya bisa mengurutkan berdasarkan beberapa kolom tetapi tidak berdasarkan nilai?

  4. Beberapa kotak daftar pilihan Negara tidak menampilkan semua Kota di kotak daftar lain (Php, mysql, ajax)

  5. Cara membuat pemicu di perpustakaan migrasi Codeigniter