create index idx_user_last_name on user(last_name(20))
# 其中 20 是前缀字符数,对于 char/varchar 可选,对于 text/blob 必传
# 且 20 这个字符数设置为多少有讲究,为什么不设置为 1 等较小的字符数?原因是字符数较少,重复性就很高,就像不要给性别这样的大量重复的字段设置索引一样。因为重复性太高,MySQL 走索引时还是要在相同值上花大量扫描次数
count(distinct left(last_name, 1)) as c1, # 假设 c1=25
count(distinct left(last_name, 5)) as c2, # 假设 c2=966
count(distinct left(last_name, 10)) as c3 # 假设 c3=996
c1、c2、c3 中,应选择基本上囊括大部分的唯一值且字符数又不是太多的。首先 c3 的唯一值肯定比其他多(字符数选择的多,必然唯一值更多),这里选择 c2 而不是 c3,原因是 c3 相对于 c2 增加了一倍的字符数换来的唯一值数量的增加不明显!