MySQLред рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?


рдПрдХ рдХрдордЬреЛрд░ рд▓реИрдкрдЯреЙрдк, рдХрдИ рдорд┐рд▓рд┐рдпрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирдореВрдиреЗ рд╣рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд╣реИред

рддрд╛рд▓рд┐рдХрд╛ (рдкрд░реАрдХреНрд╖рдг) рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ рдХреЛрдИ рдЫреЗрдж рдирд╣реАрдВ рд╣реИ рдФрд░ 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдЙрддреНрдкрд╛рджрди рдХреЗ рддрд░реАрдХреЗ


  1. рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд░реИрдВрдб + рд╕реАрдорд╛

    рдЫрд╡рд┐

    рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
    SELECT pk_id FROM test ORDER BY rand() LIMIT 1 

    MySQL рдФрд╕рдд рд▓реАрдб рд╕рдордп 6.150 рд╕реЗрдХрдВрдб рд╣реИ

    рдЖрдЗрдП 100 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
     SELECT pk_id FROM test ORDER BY rand() LIMIT 100 

    рдФрд╕рдд рд▓реАрдб рд╕рдордп 6.170-6.180 рд╕реЗрдХрдВрдб
    рдпрд╣реА рд╣реИ, 1 рдФрд░ 100 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

  2. COUNT * рд░реИрдВрдб ()

    рдЫрд╡рд┐

    рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
     SELECT t.pk_id FROM test as t, (SELECT ROUND(COUNT(pk_id)*rand()) as rnd FROM test LIMIT 1) t WHERE t.pk_id = rnd 

    рд╕рд╛рде
     ROUND(COUNT(pk_id)*rand()) 
    рд╣рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓рддреА рд╣реИред
    рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо "рд░реИрдВрдб" рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ pk_id рдХреЗ рд╕рд╛рде рд╕рдордХрдХреНрд╖ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП WHERE рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
    рдФрд╕рдд рд▓реАрдб рд╕рдордп - 1.04 рд╕реЗрдХрдВрдб
    рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЦреАрдВрдЪ рд╕рдХреЗрдВред
    рд╣рдорд╛рд░реЗ рдЙрдк-рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреБрдЫ рдФрд░ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЪреЗрдХ рдХреЛ "=" рд╕реЗ IN рдореЗрдВ рдмрджрд▓ рджреЗрдВ
     SELECT t.pk_id FROM test as t, (SELECT ROUND(COUNT(pk_id)*rand()) as rnd, ROUND(COUNT(pk_id)*rand()) as rnd2, ROUND(COUNT(pk_id)*rand()) as rnd3 FROM test LIMIT 1) t WHERE t.pk_id IN (rnd,rnd2,rnd3) 

    рдФрд╕рдд рд▓реАрдб рд╕рдордп 1.163 рд╕реЗрдХрдВрдб рд╣реИред
    рдкреНрд░рд╛рдкреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рдХрд╛рдлреА рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред
    100 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рд╕реЛрдЪрдирд╛ рднреА рдбрд░рд╛рд╡рдирд╛ рд╣реИ :)

  3. INFORMATION_SCHEMA + рд╕реАрдорд╛

    рдЫрд╡рд┐

    рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
     SELECT t.pk_id FROM test as t, (SELECT ROUND((SELECT table_rows as tr FROM information_schema.tables WHERE table_name = 'test') *rand()) as rnd FROM test LIMIT 1) tmp WHERE t.pk_id = rnd 

    рдЙрдкрд╢рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреБрд▓ рдлрд╝рдВрдХреНрд╢рди COUNT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рддрд╛рд▓рд┐рдХрд╛ 'рдкрд░реАрдХреНрд╖рдг' рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдХреА рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ 2 рдореЗрдВ рд╣реЛрддреА рд╣реИред
    рдФрд╕рдд рд▓реАрдб рд╕рдордп - 0.042 рд╕реЗрдХрдВрдб
    рдиреНрдпреВрдирддрдо рд░рдирдЯрд╛рдЗрдо 0.003 рд╕реЗрдХрдВрдб рд╣реИред
    рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ 100 рд▓рд╛рдЗрдиреЗрдВ рдорд┐рд▓реЗрдВ:
     SELECT t.pk_id FROM test as t, (SELECT ROUND((SELECT table_rows as tr FROM information_schema.tables WHERE table_name = 'test') *rand()) as rnd FROM test LIMIT 100) tmp WHERE t.pk_id in (rnd) ORDER BY pk_id 

    WHERE "=" рдХреЛ IN рдореЗрдВ рдмрджрд▓реЗрдВ рдФрд░ рд╕рдмрдХреНрд▓реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯреА рд╣реБрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ 100 рдореЗрдВ рдмрджрд▓реЗрдВред
    рдФрд╕рдд рдиреЗрддреГрддреНрд╡ рд╕рдордп - 0.047 рд╕реЗрдХрдВрдб
    1000 рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп - 0.053 рд╕реЗрдХрдВрдб
    10,000 рд░рд┐рдХреЙрд░реНрдб ~ 0.21 рд╕реЗрдХрдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп
    рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо 1.9 рд╕реЗрдХрдВрдб рдореЗрдВ 100,000 рд░рд┐рдХреЙрд░реНрдб рд▓реЗрддреЗ рд╣реИрдВ
    рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ INFORMATION_SCHEMA рд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдЦреНрдпрд╛ COUNT (*) рд╕реЗ рдереЛрдбрд╝реА рдмрдбрд╝реА рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП 100,000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рджреМрд░рд╛рди 7-8 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЦреЛ рдЬрд╛рддреА рд╣реИрдВред 1-100 рдкрд░, рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ (рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛, рдХрдо рдореМрдХрд╛)ред рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдкреБрдирд░реНрдмреАрдорд╛ рдХреЗ рд▓рд┐рдП 1-2 рд▓рд╛рдЗрдиреЗрдВ рдЕрдзрд┐рдХ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ :)

  4. MAX * рд░реИрдВрдб ()

    рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
     SELECT t.pk_id FROM test as t, (SELECT ROUND((SELECT MAX(pk_id) FROM test) *rand()) as rnd FROM test LIMIT 1) tmp WHERE t.pk_id = rnd 

    рдФрд╕рдд рд▓реАрдб рд╕рдордп - 0.001 рд╕реЗрдХрдВрдб
    100 рд▓рд╛рдЗрдиреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
     SELECT t.pk_id FROM test as t, (SELECT ROUND((SELECT MAX(pk_id) FROM test) *rand()) as rnd FROM test LIMIT 100) tmp WHERE t.pk_id in (rnd) ORDER BY pk_id 

    рдФрд╕рдд рд▓реАрдб рд╕рдордп - 0.003 рд╕реЗрдХрдВрдб

    рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ред


рдирд┐рд╖реНрдХрд░реНрд╖




UPD: рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЫреЗрдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд╕рд░реА рдФрд░ рддреАрд╕рд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓реМрдЯрддреЗ рд╕рдордп, рдЖрдк рдПрдХ рдмрд░рд╛рдмрд░ рдЪреЗрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди> = рдФрд░ LIMIT 1 рдЬреЛрдбрд╝реЗрдВред рддрдм рдорд╛рди "рдЫреЗрдж" рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдиреЗ рдкрд░ рднреА рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж xel ред
UPD2: 4 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж smagen ред

Source: https://habr.com/ru/post/In154905/


All Articles