рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
рдПрдХ рдХрдордЬреЛрд░ рд▓реИрдкрдЯреЙрдк, рдХрдИ рдорд┐рд▓рд┐рдпрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирдореВрдиреЗ рд╣рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд╣реИред
рддрд╛рд▓рд┐рдХрд╛ (рдкрд░реАрдХреНрд╖рдг) рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
- - pk_id (рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА)
- - рдЖрдИрдбреА (рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рднрд░рд╛ рдХреНрд╖реЗрддреНрд░)
- - рдорд╛рди (рд░реИрдВрдб рд╕реЗ рднрд░рд╛ рдХреНрд╖реЗрддреНрд░)
рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА
рдореЗрдВ рдХреЛрдИ рдЫреЗрдж
рдирд╣реАрдВ рд╣реИ рдФрд░
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 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
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 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рд╕реЛрдЪрдирд╛ рднреА рдбрд░рд╛рд╡рдирд╛ рд╣реИ :)
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 рд▓рд╛рдЗрдиреЗрдВ рдЕрдзрд┐рдХ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ :)
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 рд╕реЗрдХрдВрдб
рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ред
рдирд┐рд╖реНрдХрд░реНрд╖
- рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЪрд╛рд╣реЗ рдЦреЗрддреЛрдВ рдореЗрдВ рдЫреЗрдж рд╣реЛ рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╣реЛ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдзреАрдорд╛
- рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЙрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рдЫреЗрдж рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ (рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдкрд░) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 6 рдЧреБрдирд╛ рддреЗрдЬ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- рддреАрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬреЛрдЦрд┐рдо рдФрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рд╣реАрди рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ (рд░реЛрдВ) рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ (рдорд╛рди) рдХреЛ рд▓рдЧрднрдЧ 1 рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдпрд╛, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╡рд╛рдкрд╕реА рдЧрддрд┐ 150 рдореАрдЯрд░ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред
рдпрджрд┐ рдЖрдк 100 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 99 рдкрд░ рд▓реМрдЯреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред - рдЪреМрдерд╛ рддрд░реАрдХрд╛ рд╣реИ рд╕рдмрд╕реЗ рддреЗрдЬ рдФрд░ 6000 рдЧреБрдирд╛ рддреЗрдЬ ORDER BY рд░реИрдВрдб ()
UPD: рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЫреЗрдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд╕рд░реА рдФрд░ рддреАрд╕рд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓реМрдЯрддреЗ рд╕рдордп, рдЖрдк рдПрдХ рдмрд░рд╛рдмрд░ рдЪреЗрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди> = рдФрд░ LIMIT 1 рдЬреЛрдбрд╝реЗрдВред рддрдм рдорд╛рди "рдЫреЗрдж" рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдиреЗ рдкрд░ рднреА рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
xel ред
UPD2: 4 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
smagen ред