SELECT COUNT(*) FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN ('0','2','21','22','27','11','31') AND `empty` = 0 LIMIT 1 [ RunTime:0.1423s ]
SELECT `id`,`webid`,`catid`,`path`,`pname`,`pathall`,`title`,`cdn`,`sort`,`likecount`,`fsize`,`time`,`viewcount`,`likecount` FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN ('0','2','21','22','27','11','31') AND `empty` = 0 ORDER BY time desc,id desc LIMIT 0,10 [ RunTime:0.0045s ]
Dua pernyataan sql, masa jalan yang terakhir bermaksud masa pelaksanaan, volum data ialah 150W
Penerangan medan zhuanid ialah nilai berangka, webid ialah nilai berangka, kosong ialah 0 atau 1
Indeks biasa yang digunakan oleh SQL dalam ayat pertama ialah satu set indeks untuk zhuanid webid kosong
Indeks yang digunakan oleh SQL dalam ayat kedua ialah satu set indeks oleh zhuanid webid kosong
Ayat pertama ialah sql, had 1
Ayat kedua ialah sql, had 0, 10
Anda meminta kira untuk mengira 1.5 juta item.... Adakah anda ingin lebih cepat daripada menyemak 10 item pertama?
Tekaan saya: Medan indeks tidak ditetapkan sebagai tidak boleh dibatalkan, menyebabkan count(*) tidak menggunakan indeks.
Selain itu, kedua-dua kenyataan ini sendiri tidak setara
Anda perlu melihat pelan pelaksanaan anda Jika set keputusan SQL pertama adalah sangat besar, anda perlu mengimbas semua rekod yang memenuhi syarat ini, SQL kedua menggunakan indeks id masa dan hanya perlu cari 10 rekod yang memenuhi syarat itu sahaja, jadi ia akan menjadi lebih cepat Selain itu, indeks gabungan zhuanid webid kosong hanya akan menggunakan lajur zhuanid dan bahagian julat webid
Selepas SQL pertama dilaksanakan, hasilnya disimpan dalam Cache.
Pelaksanaan SQL kedua bergantung pada Cache SQL pertama, jadi ia akan menjadi lebih pantas (sebenarnya, SQL kedua menggunakan pengisihan, jadi ia sepatutnya lebih perlahan).
Poster boleh melaksanakannya selepas SQL pertama dilaksanakan
Set semula Cache dan kemudian laksanakan SQL kedua, hasilnya berbeza.