рд╕реНрдлрд┐рдВрдХреНрд╕: рдбреЗрд▓реНрдЯрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдХрдИ рдЦреЛрдЬ рд╕рд░реНрд╡рд░

рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рд╕рд╛рдордЧреНрд░реА рдЦреЛрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИред
рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╕реНрдлрд┐рдВрдХреНрд╕ рдЦреЛрдЬ рдЗрдВрдЬрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЬрдм рдЖрдзрд╛рд░ рдмрдбрд╝рд╛ рдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ reindexing рдореЗрдВ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рдбреЗрд▓реНрдЯрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдЦрдХ рдХреЛ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдЙрд╕ рд╕рдордп рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрдм рдмрд╛рд░рд╣рд╕рд┐рдВрдЧрд╛ рдХреЛ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрдирд╛ рд╢реБрд░реВ рд╣реБрдЖред

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
source src_mysql { type = mysql sql_host = localhost sql_user = sphinx sql_pass = secret sql_range_step = 1000 } source src_news : src_mysql { sql_db = project sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 'src_news', MAX(id) FROM news sql_query_range = SELECT MIN(id), MAX(id) FROM news sql_query = SELECT id as news_id, title, content FROM news WHERE id>=$start AND id<=$end } source src_news_delta : src_news { sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_range = sql_query = SELECT id as news_id title, content FROM news \ WHERE id > ( SELECT max_value FROM sph_counter WHERE source = 'src_news') sql_query_post = REPLACE INTO sph_counter SELECT 'src_news', MAX(id) FROM news } 


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

рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдкрдХреЛ sph_counter рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рд╕рд░реНрд╡рд░ рдЖрдИрдбреА рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЙрд▓рдо рдЬреЛрдбрд╝реЗрдВред

рдирддреАрдЬрддрди, рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 CREATE TABLE IF NOT EXISTS `sph_counter` ( `source` varchar(100) NOT NULL DEFAULT '', `max_value` bigint(20) NOT NULL, `hostname` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`source`,`hostname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

* рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ REPLACE INTO рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ

рдЕрдЧрд▓рд╛, рд╡рд┐рдХрд▓реНрдк 2 рдХреЗ рдЖрдкрдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

1. рд╕реНрдлрд┐рдВрдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддреА рд╣реИ, рдорд╛рд╕реНрдЯрд░-рдорд╛рд╕реНрдЯрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ: рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ MySQL рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - 'hostname'
рд╣рдорд╛рд░рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:
 source src_news : src_mysql { sql_db = project sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 'src_news', MAX(id), @@hostname FROM news sql_query_range = SELECT MIN(id), MAX(id) FROM news sql_query = SELECT id as news_id, title, content FROM news WHERE id>=$start AND id<=$end } source src_news_delta : src_news { sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_range = sql_query = SELECT id as news_id, title, content FROM news \ WHERE id > ( SELECT max_value FROM sph_counter WHERE source = 'src_news' AND hostname = @@hostname) sql_query_post = REPLACE INTO sph_counter SELECT 'src_news', MAX(id), @@hostname FROM news } 


2. MySQL рдФрд░ Sphinx рд╕рд░реНрд╡рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣реЛрд╕реНрдЯрдирд╛рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрд╕ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ: рд╣рдо рдХрдиреЗрдХреНрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 source src_news : src_mysql { sql_db = project sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_pre = SELECT @sphinx_instance:=IF(STRCMP(@sphinx_host:=SUBSTRING_INDEX(host,':',1),'localhost'),@sphinx_host,@@hostname) AS sphinx_instance \ FROM information_schema.processlist WHERE ID=connection_id(); sql_query_pre = REPLACE INTO sph_counter SELECT 'src_news', MAX(id), @sphinx_instance FROM news sql_query_range = SELECT MIN(id), MAX(id) FROM news sql_query = SELECT id as news_id, title, content FROM news WHERE id>=$start AND id<=$end } source src_news_delta : src_news { sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query_pre = SELECT @sphinx_instance:=IF(STRCMP(@sphinx_host:=SUBSTRING_INDEX(host,':',1),'localhost'),@sphinx_host,@@hostname) AS sphinx_instance \ FROM information_schema.processlist WHERE ID=connection_id(); sql_query_pre = REPLACE INTO sph_counter SELECT 'src_news', MAX(id), @sphinx_instance FROM news sql_query_range = sql_query = SELECT id as news_id, title, content FROM news \ WHERE id > ( SELECT max_value FROM sph_counter WHERE source = 'src_news' AND hostname = @sphinx_instance) sql_query_post = REPLACE INTO sph_counter SELECT 'src_news', MAX(id), @sphinx_instance FROM news } 


рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

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


All Articles