把行數最小的作為主表,然后去join行數多的,這樣對於索引而言掃描的行數會少很多
在join之后On的條件,類型不同是無法走索引的,也就是說如果on A.id = B.id,雖然A表和B表的id都設置了索引,但是A表的id是Int,而B表的id是varchar,則無法走索引
字符編碼也會導致無法走索引。字符編碼常見的是utf8和utf8mb4,utf8mb4是可以兼容utf8的,也就是說如果A表是utf8mb4,B表是utf8,則on A.uinstanceid = B. uinstanceid是可以走索引的,但是如果把B表當作主表,讓B去join A on B.uinstanceid = A. uinstanceid則無法走索引
在我的項目里,就是上面的字符編碼問題導致的join后沒有走索引
改表和字段的字符編碼,統一成ut8mb4
ALTER TABLE visitor DEFAULT CHARSET utf8mb4;
ALTER TABLE visitor CHANGE visitor_id visitor_id varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '';