Mysql 为什么要有最左前缀的要求，优化器不能自己优化调整顺序吗
比如一个联合索引 `index('user_id', 'created_at')` ，我写了下面的 `SQL` 语句
```
select
    *
from
    tweet
where
    created_at < '2021-11-11'
    and user_id = 1
```
优化器会把上面的语句优化为下面的语句吗？
```
select
    *
from
    tweet
where
    user_id = 1
    and created_at < '2021-11-11'
```
你对左前缀理解错了。
你这种情况是可以用到索引的。
左前缀是指这种情况走不了索引
```
select
    *
from
    tweet
where
    created_at < '2021-11-11'
```
而这种情况可以
```
select
    *
from
    tweet
where
    user_id = 1
```
因为 `user_id` 在联合索引的左边。
如果有索引 (a, b, c) 那么 `where a, b, c`、`where a, b`、`where a` （where 后的顺序无关，可以随意组合，但是跟出现的字段有关）都是可以走到索引的。但是 `where b, c` 就不走索引了，因为按照左前缀原则，这里必须要出现 `a` 才行。
使用如下。
上表中，第二行，`a, c` 虽然是联合索引`(a, b, c)` 中有两个字段，但是因为这里没有出现 `b`，按照做前缀原则就断开了，所以只能使用到 `a`
注意上文中 where 顺序可以随意组装，比如 `a, b, c` 你可以写成 `a, c, b`、 `c, a, b` 等，这些都不影响，但是出现的字段必须是上面写到的。
除了 where 外，还有 order。
`where a order c` 这个就只会用到 (a, b, c) 中的 `(a)` ，而如果是 `where a order b` 则能用到 `(a, b)`