参考 :
http://blog.chinaunix.net/uid-20708886-id-4064033.html
https://blog.csdn.net/weixin_42661074/article/details/89923289
1、不建议使用场景
①不常用的列,若建立索引会增大空间需求,实用性不高;
②枚举类型的列或者很少值的列,并不能提高效率;
③数据表操作(增、删、改)远大于查询时不建议创建索引。
④数据类型:text、image、bit类型;
①不常用的列,若建立索引会增大空间需求,实用性不高;
②枚举类型的列或者很少值的列,并不能提高效率;
③数据表操作(增、删、改)远大于查询时不建议创建索引。
④数据类型:text、image、bit类型;
2、替换like的几种方法
1.LOCATE语句
SELECT column from table where locate(‘keyword’, condition)>0
2.locate 的別名 position
POSITION语句
SELECT column from table where position(‘keyword’ IN condition)
3.INSTR语句
SELECT column from table where instr(condition, ‘keyword’ )>0
4.以字段开头模糊查询的left(字段,长度)的方法查询
select * from t where left(t.user_code, 1)='A';
5.findinset
select * from t where FINDINSET('1',t.name);//t.name所查询的字段,所有包含1的数据
3、用in代替or
IN()相当于多个OR,因为IN和OR在逻辑上是等同的。
[1] 对IN列表中的数值进行排序。
[2] 对于查询的匹配,每次使用二分查找去匹配IN列表的数值。
所以对于第[2]步,每次比较的算法复杂度大概为O(log n)。相反,对于同样逻辑的OR列表,每次都要遍历,所以OR相应的算法复杂度为O(n)(因此对于遍历非常大的OR列表,会很缓慢!)。
因此,在了解了IN和OR的区别之后,每次优化,我们可以采用如下方式:
1.尽量将能使用IN来代替OR查询。
2.对IN列表中的数据,写SQL的时候排好序,避免MySQL来做这个工作。