LIMIT 0,5 сұранысты 350 рет SLOWER іске қосады

Келесі 0,02 секунд астында MySQL сұрауы орындалады:

 SELECT
    *
 FROM
    `Table1`
 WHERE
    `col1`     = '43532' AND
    `col2`     = 'N'
 ORDER BY col3 DESC 

Алайда, соңында LIMIT 0, 5 қоссам, ол 7 секундтан астам аяқталады:

 SELECT
    *
 FROM
    `Table1`
 WHERE
    `col1`     = '43532' AND
    `col2`     = 'N'
 ORDER BY col3 DESC 
 LIMIT 0, 5

Бұл сұрау бос нәтиже жиынын қайтарғанда да орын алады.

Неге бұл қарапайым сұраудың 350 рет баяулауына әкелетін LIMIT 0, 5 қосу? Нәтижелерді пагинация себептері бойынша шектей білуім керек, сондықтан оны қалай түзете аламын?

EDIT:

ШЕКТІҢІЗ, EXPLAIN дейді:

id  select_type table   type    possible_keys   key     key_len   ref     rows  Extra
1   SIMPLE      Table1  ref     col1,col2       col1    5         const   2441  Using where; Using filesort

LIMIT, EXPLAIN сөзі:

id  select_type table   type    possible_keys   key   key_len   ref   rows  Extra
1   SIMPLE      Table1  index   col1,col2       col3  5         NULL  1050  Using where
0
@cruse: Жоғарыдағы түзетуді қараңыз.
қосылды автор ProgrammerGirl, көзі
@GolezTrol: Жоғарыда келтірілген EDIT-ны қараңыз, әрбір 2 сұраным үшін әртүрлі EXPLAIN-нің (LIMIT 0,5/жоқ).
қосылды автор ProgrammerGirl, көзі
@Adrian Cornish: SQL_NO_CACHE айырмашылығы жоқ. Кесте 1-ден INDEX-ды көрсету бірнеше индекстелген бағандарды жеке түрде, соның ішінде сұрауда қамтылған ALL columns (col1, col2 және col3) тізімдейді.
қосылды автор ProgrammerGirl, көзі
Түпкілікті уақыт нәтижелерін алуды және «ШЕШІМДІ INDEX FROM <tablename>» -ден сенімді болу үшін «таңдайтын SQL_NO_CACHE» қосуға бола ма? Сіз екі сұрақты да түсіндіре аласыз ба?
қосылды автор Adrian Cornish, көзі
Бұл екі сауалға түсіндіру жазба ма? Мүмкін, LIMIT MySQL-ды басқа кілтті қолдануға мәжбүр етеді.
қосылды автор GolezTrol, көзі
Бұл сұрауларды оңтайландыру әдісі пайдалы болуы мүмкін: databasejournal.com/features/mysql/article.php/1382791/…
қосылды автор Brad Christie, көзі
EXPLAIN дегеніміз не?
қосылды автор ckruse, көзі

2 жауаптар

Лимитті бастау, маржа DB қозғалтқышының есебіне байланысты. Бесжылдықтың әр 5 жолында ДБ-ға соққы бермеу үшін, ол 500 жазбаны әкелуі керек Алдыңғы соңында, одан кейін JavaScript арқылы кез-келген 500 жазбаға қол жеткізуге болады.

0
қосылды
Бірақ неге сұрау нәтижесін 350 рет баяу етеді, тіпті бос нәтижеге? Ұқсас, тағы бір нәрсе жүріп жатыр ...
қосылды автор ProgrammerGirl, көзі
Ол алдымен жазбаларды алып, одан кейін қажетті жолдарды шығарып, temp_table-ге енгізіп, содан кейін temp_table-тан қажетті жолдарды шығарады ...
қосылды автор Sashi Kant, көзі

Мәселе мынада, бұл лимит MySQL-ты алдымен сұрауды тапсырыс беріп, бүкіл жиынтығын реттеуге мәжбүрлеп, индекстерді пайдаланбай сүзгіден өткізеді.

MySQL-қа қандай индексті пайдалану керектігін айтатын нұсқаулар бар, бірақ Col1, col2 және col3-те біріктірілген индексті жасау жақсы болуы мүмкін. MySQL осы индексті сүзгілеу және сұрыптау үшін пайдаланады. Col3 осы индекстегі бірінші немесе соңғы баған болса, сұрау жылдамырақ болатынын көру үшін эксперимент жүргізуіңіз керек.

0
қосылды