Rumah > Soal Jawab > teks badan
explain select * from ecs_ad where ad_id =1 or ad_id = 3;
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
| 1 | SIMPLE | ecs_ad | range | PRIMARY | PRIMARY | 2 | NULL | 2 | Using index condition |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
1 row in set
Ini adalah kesatuan semua
explain select * from ecs_ad where ad_id = 4 union all select * from ecs_ad where ad_id = 3;
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
| 1 | PRIMARY | ecs_ad | const | PRIMARY | PRIMARY | 2 | const | 1 | NULL |
| 2 | UNION | ecs_ad | const | PRIMARY | PRIMARY | 2 | const | 1 | NULL |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
3 rows in set
PHPz2017-05-18 10:58:52
Pertama sekali, jurang prestasi antara dua pertanyaan ini seharusnya tidak besar.
Kerana lajur ad_id adalah kunci utama.
Mengikut analisis lajur taip:
atau pertanyaan, type:range
union all 查询:type:const / const / ALL
首先可以确认的是,const
要优于 range
.const
也是因为 ad_id 为主键.
但是 union all 做了三次操作,两次主键或者唯一索引查询 type:const,但最后组合到一起时 type:ALL
type:ALL 本身性能比 range 还要差
从 Type 看,or 查询性能应该更好.
Extra 分析
or 查询:Using index condition
union all 查询:NULL / NULL / Using temporary
union semua pertanyaan: type: const / const / SEMUA
Perkara pertama yang boleh disahkan ialah const
lebih baik daripada range
.
const
juga kerana ad_id ialah kunci utama.#🎜 🎜#
Tetapi kesatuan semua melakukan tiga operasi, dua kunci utama atau pertanyaan indeks unik jenis:const, tetapi apabila akhirnya digabungkan bersama taip:SEMUA
jenis:SEMUA sendiri mempunyai prestasi yang lebih teruk daripada julatunion semua pertanyaan:Dari sudut pandangan Jenis, atau prestasi pertanyaan harus lebih baik.
atau pertanyaan:
Analisis tambahanMenggunakan keadaan indeks
Menggunakan keadaan indeks ialah ciri yang baru ditambah selepas versi MySQL 5.6, tolak keadaan indeks.
3) Jalankan 1) sehingga baris terakhir data.Pertama sekali, mari bercakap tentang aliran pemprosesan apabila tiada syarat indeks untuk ditolak:
2) Lapisan pemisah menilai keadaan di mana Jika baris data memenuhi syarat di mana, ia akan digunakan, jika tidak, ia akan dibuang.
Apabila pengoptimum tidak menggunakan ICP, akses data dan proses pengekstrakan adalah seperti berikut:
1) Apabila enjin storan membaca baris seterusnya, ia mula-mula membaca tuple indeks, dan kemudian menggunakan tuple indeks untuk mencari dan membaca keseluruhan baris data dalam jadual asas.
Aliran pemprosesan apabila terdapat keadaan indeks tolak:
Apabila pengoptimum menggunakan ICP, lapisan pelayan akan menolak ke bawah keadaan yang boleh dinilai dengan menggunakan indeks ke lapisan enjin storan. Proses capaian dan pengekstrakan data adalah seperti berikut:
1) Enjin storan membaca tuple indeks seterusnya daripada indeks.
3) Jika syarat indeks tolak ke bawah dipenuhi, enjin storan mencari baris jadual asas melalui tuple indeks dan membaca keseluruhan baris data dan mengembalikannya ke lapisan pelayan. 4) Penilaian lapisan pelayan tidak ditolak ke keadaan di mana lapisan enjin storan Jika baris data memenuhi syarat di mana, ia akan digunakan, jika tidak, ia akan dibuang.
#🎜🎜#Ringkasnya, apabila tiada ICP, enjin storan mengembalikan semua baris data yang memenuhi syarat, dan melakukan penapisan keadaan di lapisan perkhidmatan. #🎜🎜#Apabila ada ICP, keadaan di mana ditolak ke lapisan enjin storan, dan enjin storan terus mengembalikan data yang memenuhi syarat. #🎜🎜#Prestasi secara semula jadi akan bertambah baik. #🎜🎜# #🎜🎜#Untuk pengenalan berkaitan ICP, anda boleh semak di sini#🎜🎜# #🎜🎜#Menggunakan sementara mewakili jadual sementara tersirat, yang bermaksud bahawa MySQL akan menjana jadual sementara untuk menyimpan data perantaraan. Kerana kesatuan semua adalah hubungan di mana mereka diproses secara berasingan dan digabungkan pada akhirnya. #🎜🎜#Dari Extra, ia juga sepatutnya atau prestasi pertanyaan lebih tinggi. #🎜🎜# #🎜🎜##🎜🎜# Diambil bersama: prestasi pertanyaan OR harus lebih baik daripada UNION ALL.#🎜🎜##🎜🎜#Memandangkan prestasi semua pertanyaan berubah apabila jumlah data meningkat, analisis di atas hanya berdasarkan hasil analisis Terangkan yang disiarkan oleh subjek. Ini bukan untuk mengatakan bahawa OR lebih baik daripada UNION ALL dalam semua situasi.
Di atas adalah pendapat peribadi, mohon betulkan jika ada kesilapan.
黄舟2017-05-18 10:58:52
Tiada perbezaan antara dua ayat ini.
Secara amnya, ATAU menghubungkan dua medan yang berbeza Apabila indeks tidak boleh digunakan, prestasinya akan menjadi kurang baik seperti kesatuan.