cari

Rumah  >  Soal Jawab  >  teks badan

mysql - Untuk kedua-dua pernyataan SQL ini, satu menggunakan atau dan satu lagi menggunakan kesatuan semua Prestasinya sepatutnya lebih baik daripada yang kedua, bukan?

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
PHPzPHPz2747 hari yang lalu1163

membalas semua(2)saya akan balas

  • PHPz

    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, jenis: julattype: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 temporaryunion 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 julat

    Dari sudut pandangan Jenis, atau prestasi pertanyaan harus lebih baik.


    Analisis tambahan

    atau pertanyaan: Menggunakan keadaan indeks
    union semua pertanyaan: NULL / NULL / Menggunakan sementara

    Menggunakan keadaan indeks ialah ciri yang baru ditambah selepas versi MySQL 5.6, tolak keadaan indeks.

    Pertama sekali, mari bercakap tentang aliran pemprosesan apabila tiada syarat indeks untuk ditolak:


    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.

    2) Lapisan pemisah menilai keadaan di mana Jika baris data memenuhi syarat di mana, ia akan digunakan, jika tidak, ia akan dibuang.
    3) Jalankan 1) sehingga baris terakhir data.



    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.

    2) Enjin storan menggunakan tuple indeks untuk menilai keadaan indeks tekan bawah. Jika keadaan di mana tidak dipenuhi, enjin storan akan memproses tuple indeks seterusnya (kembali ke langkah sebelumnya). Hanya apabila tuple indeks memenuhi syarat indeks tekan ke bawah, data akan terus dibaca dari jadual asas.

    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.

    balas
    0
  • 黄舟

    黄舟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.

    balas
    0
  • Batalbalas