我想将一些MySQL表同步到一个ElasticSearch索引,你知道,search。
但几乎所有我能find的例子都显示了一个很大的坏的“SELECT * FROM”,可以举个例子,但是我正在生产中,在我的一张桌子里面有10M行,所以我甚至不想尝试每隔一分钟“select*”。
我习惯了狮身人面像和它
UPDATE ... SET current_id = last_id, last_id = MAX(id); SELECT * WHERE id > (SELECT current_id...);
一种策略。
我几乎没有问题,但只是“差不多”,因为一个物品在其生命的第一个分钟通常有很大的可能性被修改,它将被索引为“新生”并保持原样。
所以我可以想象更好的策略,比如触发器在“索引”表中存储主键,在更新和创build时,河stream成为
SELECT * FROM ... WHERE id IN (SELECT id ... FROM to_index)
从来没有尝试过,但似乎更好,至less有一个更好的开始点。
还有删除行的问题…
但它可能存在众所周知的策略,经过充分讨论和testing,我没有find它们,我在这里错过了什么大事? 或者我是唯一试图避免在数百万原料中使用SELECT *的人?
readme有点长,但是有一个关于这个的章节:
https://github.com/jprante/elasticsearch-river-jdbc#how-to-select-incremental-data-from-a-table
我们的想法是保持每行更改的微秒级时间戳,并要求ES自上次运行以来查询:
{ "type" : "jdbc", "jdbc" : { "url" : "jdbc:mysql://localhost:3306/test", "user" : "", "password" : "", "sql" : [ { "statement" : "select * from \"products\" where \"mytimestamp\" > ?", "parameter" : [ "$river.state.last_active_begin" ] } ], "index" : "my_jdbc_river_index", "type" : "my_jdbc_river_type" } }