在MySQL中,像LIKE、IN、>、=
這些操做符都屬於Item
類型(在Postgres中,這些都是expression
)。本節中,咱們詳細說說LIKE和IN是怎麼實現的。express
先說IN,它對應的類爲Item_func_in
(位於item_cmpfunc.cc
中)。其中一個重要的地方是:數組
class Item_func_in :public Item_func_opt_neg { public: // An array of values, created when the bisection lookup method is used in_vector *array;
這裏的array
記錄了IN
對應的list,例如WHERE id IN (3, 5, 7)
,那麼這裏的array
就是(3, 5, 7)。進行evaluate的時候其實是在array
中進行折半查找。多線程
須要注意的是,若是咱們加入併發執行,那麼多個線程就共享了這個array
,當進行折半查找的時候,指針移動會錯亂。解決方法是新設置一個array
數組對應不一樣的線程。併發
再說LIKE
,它對應的類爲Item_func_like
. 不像IN
有array
,LIKE
會把讀出的字符串放入一個類成員變量str_value
中(其實是Item
的成員變量)。所以若是想作併發執行,多線程就共用了該變量。解決辦法和上面相似,獨立出一個str_value
數組,來對應不一樣線程便可。lua