Mga nakatagong problema at solusyon para sa paggamit ng order ayon sa limitasyon sa query ng MySQL

Hidden Troubles Solutions



Mga nakatagong problema at solusyon para sa paggamit ng order ayon sa limitasyon sa query ng MySQL

Madalas naming ginagamit ang order ayon at limitahan upang pag-uri-uriin kapag gumagawa ng query sa data, limitahan ang bilang ng mga bar o pag-uuri ng pahina, at hindi makahanap ng anumang mga pagbubukod sa normal na paggamit. Gayunpaman, ginamit ng isang kamakailang proyekto ang pamamaraang ito upang makahanap ng isang seryosong problema kapag nagtatanong. Kapag nag-import ako ng data sa Job, dahil mayroong isang malaking halaga ng data na na-import nang sabay, ang oras ng paglikha ng data na DataChange_CreateTime ay tumpak lamang sa oras, minuto, pangalawa, at parehong oras. data Kapag ginamit mo ang order sa pamamagitan ng limitasyon upang magtanong sa pahina at i-filter ang isang tiyak na bilang ng mga beses, hindi magkatugma ang mga resulta. Kapag ang bilang ng mga query (iyon ay, ang limitasyon ng data) ay 10 at 1000, ang unang 10 data ng dalawang mga resulta ay hindi naaayon. Katanungan ang data upang mahanap ang problema, at ibibigay ang solusyon sa paglaon. Itala ito at pigilan ang iyong sarili na magkamali nang sabay.

Katulad na sitwasyon ng problema

Mayroong isang talahanayan na may sumusunod na istraktura:
5000, flag 0 , pay_time
Humigit-kumulang na 5000 data, ang karamihan sa mga tala ay may isang bandila na katumbas ng 0, at ang format ng timestamp ng patlang na pay_time ay tama.



Ginagamit namin ang limitasyon upang mabasa ang data sa mga batch:



select id, pay_time from order_customer_new where flag=0 order by pay_time asc limit 250, 10

Sa panahon ng proseso ng pagbabasa ng data, nalaman na mayroong mga talaan na may pantay na timestamp, na binabasa nang dalawang beses, at maaaring mawala ang isang tiyak na tala. Tulad ng ipinakita sa figure sa ibaba, ang record na may id = 465 ay nawala.
imahe
imahe
Ano ang sitwasyon, mawawala ang data para sa id = 465? Para sa opisyal na impormasyon, ang mga sumusunod na paliwanag ay magagamit:
imahe
Marahil ay nangangahulugang: Kung ihalo mo ang Limitahan ang row_count sa pagkakasunud-sunod, makikita ng MySQL ang pinagsunod-sunod na row_count row at babalik kaagad, sa halip na pag-uuriin ang buong resulta ng query at bumalik. Kung ito ay pinagsunod-sunod ayon sa index, ito ay magiging napakabilis kung ito ay pag-uuri-uri ng file, ang lahat ng mga hilera na tumutugma sa query (nang walang Limitasyon) ay mapipili, ang karamihan o lahat ng napili ay aayusin hanggang sa makita ang limit_required row_count. Kung ang linya ng row_count na kinakailangan ng limitasyon ay natagpuan, hindi aayos ng Mysql ang natitirang mga hilera sa itinakdang resulta.
Sa madaling salita, dapat na ang mga halaga ng pag-order ay pantay, na nagreresulta sa kawalan ng katiyakan ng order.



Solusyon

Kung nais mong matiyak na ang mga resulta ng pag-uuri ay pare-pareho at tama sa kaso na inilarawan sa itaas, maaari kang magdagdag ng isang bagong kundisyon ng pag-uuri, lalo na upang magdagdag ng natatanging pangunahing pangunahing larangan sa isa sa mga kundisyon ng pag-uuri, upang ang resulta ng pag-uuri ay natatanging natukoy , madalas Masolusyunan ang problema. Halimbawa, kung ang pangunahing key id ay idinagdag sa isa sa mga kundisyon ng pag-uuri sa query sa itaas, ang resulta ng query ay ganap na wasto.
imahe

Tandaan: Ang mga halimbawa sa artikulong ito ay direktang paggamit https://blog.csdn.net/tsxw24/article/details/44994835 Ang mga halimbawa sa post sa blog na ito, mga halimbawa sa aktwal na mga proyekto, ay hindi nai-quote dahil sa pagsasaalang-alang sa privacy. Ngunit ang resulta ay ang solusyon ay magagawa. Para sa iyong sanggunian lamang.