рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреА рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ 4 рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣реБрдЖред рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдпрд╛ рдкреВрдЫрддрд╛рдЫ рдореЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рдПрдХрд▓ рддрд╛рд▓рд┐рдХрд╛ рдереА рдЬрд┐рд╕рдореЗрдВ, рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
INT AUTO_INCREMENT PRIMARY KEY
рдФрд░
UNIQUE KEY
рдореМрдЬреВрдж рдереАрдВред
рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ
INSERT ... ON DUPLICATE KEY UPDATE
(рдмрд╛рдж
INSERT ODKU
), рдЬрд╣рд╛рдБ
INSERT
рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХреЙрд▓рдо
UNIQUE KEY
рд╕рд╛рде рдХреЙрд▓рдо рдХреЗ рдЕрдиреБрд░реВрдк рдереЗред рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐ рджрд┐рди рд▓рдЧрднрдЧ 24 рдШрдВрдЯреЗ рд▓рдЧрд╛рддрд╛рд░ 1500-2000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЧрдгрд┐рдд рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рдерд╛ред
рдЪрд░реНрдЪрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЪрд┐рддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ:
CREATE TABLE update_test ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, host_id TINYINT UNSIGNED NOT NULL, last_modified TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY(id), UNIQUE KEY(username) ) ENGINE=InnoDB;
рдЕрдм рдШрдЯрдирд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
(root@localhost) [test]> INSERT INTO update_test (username, host_id, last_modified) VALUES ('foo',3,NOW()); Query OK, 1 row affected (0.00 sec) (root@localhost) [test]> select * from update_test; +
рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рднреА рдирд╣реАрдВ, рд╣реИ рдирд╛? рд╣рдордиреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдпрджрд┐ рд╣рдо
SHOW CREATE TABLE
, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
AUTO_INCREMENT
рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдорд╛рди рдЕрднреА
2
ред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ
INSERT ODKU
рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:
(root@localhost) [test]> insert into update_test (username,host_id) values ('foo',1) on duplicate key update last_modified=NOW(); Query OK, 2 rows affected (0.00 sec) (root@localhost) [test]> select * from update_test; +
рдФрд░ рдЕрдм, рднрд▓реЗ рд╣реА рд╣рдордиреЗ рдирдИ рдкрдВрдХреНрддрд┐ рди
AUTO_INCREMENT
рд╣реЛ, рд╣рдорд╛рд░рд╛
AUTO_INCREMENT
рдХрд╛рдЙрдВрдЯрд░
3
рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред InnoDB рдЙрди рдмрд╛рдзрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдФрд░
PRIMARY KEY
рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдЬрд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, MySQL рд╣рдорд╛рд░реЗ
INSERT
рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛
AUTO_INCREMENT
рдореВрд▓реНрдп рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣
UNIQUE KEY
рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд▓реНрд▓рдВрдШрди рдкрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
INSERT
рдмрдЬрд╛рдп рдпрд╣
UPDATE
рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо
handler status
рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдбрд╛рд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдЕрджреНрдпрддрди рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реБрдЖ (рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛, 1 рдирд╣реАрдВ)ред
(root@localhost) [test]> show status like 'handler%'; *** some rows omitted *** +
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, "рддреЛ рдХреНрдпрд╛?" рдЖрдЗрдП рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред 1,500
INSERT ODKU
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб, рд▓рдЧрд╛рддрд╛рд░ 24 рдШрдВрдЯреЗред рдЙрдирдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛
PRIMARY KEY
рд╡рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдбреЗрдореЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ -
INT UNSIGNED
ред рд╣рдо рдЧрд┐рдирддреЗ рд╣реИрдВред
INT UNSIGNED
рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп
4294967295
ред рд╣рдо рдЗрд╕реЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1500 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 86400 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рджрд┐рди рдореЗрдВ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ 33.1 рджрд┐рди, рдпрд╛ 4 рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд┐рд▓рддрд╛ рд╣реИред рд╕рдВрдпреЛрдЧ? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рддреЛ рдЬрдм рд╣рдо рдЕрд░реНрде рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрдкрдиреА рдбреЗрдореЛ рдЯреЗрдмрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ
AUTO_INCREMENT
рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдбрд╛рд▓реЗрдВред
(root@localhost) [test]> insert into update_test (id,username,host_id) values (4294967295, 'bar', 10); Query OK, 1 row affected (0.00 sec) (root@localhost) [test]> flush status; (root@localhost) [test]> insert into update_test (username,host_id) values ('baz', 10); ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY' (root@localhost) [test]> show status like 'handler%'; *** some rows omitted *** +
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛, рдХреНрдпреЛрдВрдХрд┐
AUTO_INCREMENT
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдерд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рд╣рдо
INSERT ODKU
рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
(root@localhost) [test]> select * from update_test; +
рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛? 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ
username = "foo"
рд╕реНрдерд┐рддрд┐ рд╕реЗ
host_id
,
host_id
рдФрд░
last_modified
рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП, рдФрд░ рд╣рдо рдЖрдирдиреНрджрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ:
(root@localhost) [test]> select * from update_test; +
рдУрд╣, рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреА
id
рд╣рдорд╛рд░реЗ
AUTO_INCREMENT
рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░
username
рдХреЙрд▓рдо рдкрд░
UNIQUE KEY
рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЧрдИ рдереАред
рдЕрдм рд╣рдо рдЙрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрд╕ рдкрдж рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред 1500 рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз, рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ -
INT
рд╕реЗ
BIGINT
рддрдХ
AUTO_INCREMENT
рдХреЙрд▓рдо рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓реЗрдВред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░
рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ ред рдореИрдиреБрдЕрд▓ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдмрд▓ рдкрд░ рд╣рдорд╛рд░рд╛
INSERT ODKU
UPDATE update_test SET host_id = 7, last_modified = NOW() WHERE id = 4294967295 OR username = "foo" LIMIT 1
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рдХ
PRIMARY
рдмрдЬрд╛рдп
PRIMARY
рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ред
UNIQUE
ред
рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕реАрдЦрд╛ рд╣реИ?
AUTO_INCREMENT
рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 500k рд╕реЗ рдХрдо рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдереАрдВредAUTO_INCREMENT
рд▓рд┐рдП AUTO_INCREMENT
рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдк рдЙрдкрд▓рдмреНрдз рдорд╛рдиреЛрдВ рдХреА рдЖрдзреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред- рднреМрддрд┐рдХреА рдХреЗ рдирд┐рдпрдореЛрдВ рдХреА рддрд░рд╣ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди, рдЕрдХреНрд╕рд░ рдЪрд░рдо рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред