MySQL內核技術之"LIKE"和"IN"

在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. 不像INarrayLIKE會把讀出的字符串放入一個類成員變量str_value中(其實是Item的成員變量)。所以若是想作併發執行,多線程就共用了該變量。解決辦法和上面相似,獨立出一個str_value數組,來對應不一樣線程便可。lua

相關文章
相關標籤/搜索