每张表,在执行sql的时候同时只用一个索引,所以尽量使用多条件复合索引
索引不要建太多
索引会减慢增删改的速度
----------------------华丽丽的分割线----------------------------------------------------------------
索引采用 最左前缀匹配原则
mysql 会一直从左向右匹配索引 知道范围查询为止
索引(a,b,c)
a=1 可用索引
b=2 用不到索引(就是说以a打头的索引,如果条件没有a,就用不了,后面的也用不了)
a=1 and b>2 and c=3 用到索引中的(a,b) c没用到,因为到b就是范围查询了,(a,b,c)中b之后的索引c 因为b是范围查询而终止
b=2 and a=3 and c>3 都用到了,因为c才是范围查询 (a,b,c)中 c是最后一个,没有后面的索引,所以不会再影响后面
自己的总结:要查询的时候,用到的条件一定要有索引中的第一个 比如上面的 a 一定要在查询条件中,并且会用到范围查询的条件要尽量放到最后
----------------------华丽丽的分割线------------------------------------------------------------------------
尽量选择区分度高的列作为索引
比如 id 每条数据都不一样,这是最好的索引
但性别 可以说是50%的数据都一样,这种索引的效果不大,和没有没什么区别
最适合做索引的字段 这一字段如果 数值平均在0.1以下,也就是说 比如:类型字段 超过10个类型以上,并且数据量平均,则适合做索引
----------------------华丽丽的分割线-------------------------------------------------------------------------
索引类型 Btree 和 md5签名
Btree 各种查询都支持, md5 不支持范围查询
----------------------华丽丽的分割线---------------------------------------------------------------------------------
综合考虑查询和排序
a=1 and b=2 order by c
有利于排序的索引
(a,c)
(b,c)
(a,b,c) mysql有限选择
mysql会自动查询最有利的索引 order by c其实已经是在 a和b索引都执行之后的结果集里面去排序,效率很高
-----------------------华丽丽的分割线------------------------------------------------------------------------------------------
查询索引,尽量保持列干净
to_char(time) = 1 不走索引
time = to_char(1) 走索引
查询条件一定要是纯粹的查询条件,不能添加公式和其他函数 这样才能使用索引
-----------------------华丽丽的分割线-----------------------------------------------------------------------------------------------
尽量使用join去代替多变查询和子查询
在oracle中多表查询和子查询的效率和join差不多
但在mysql中 join的效率比多表查询和子查询迅速的多
-----------------------华丽丽的分割线----------------------------------------------------------------------------------------------------
like % 这种查询,和范围查询是同样的效果
如果这样的字段放到索引的最前面,则后面的条件都不会走了
-----------------------华丽丽的分割线-----------------------------------------------------------------------------------------------------
必要时,符合索引要进行“补洞”
比如(a,b,c)索引
a=1 and c=2 这样的查询是走不了索引的
所以需要补洞
a=1 and b in (0,1) and c=2 进行补洞,这样就可以让查询速度提高
自己的总结,留于记录