这里详细说说关于索引的正确使用:
1、使用组合索引,即多列同时构成索引,需要遵循“最左前缀”法则,否则索引无效。
2、模糊搜索like…%:%开头的(%xxx)不走索引,%不开头的(xx%xx)可以走索引,
3、索引列加函数:列名上套函数(如:reverse(name)=‘xxx’)不走索引,列值上加函数(如:name=reverse(‘xxx’)可以走索引,
4、条件or:若A索引、B不索引、C索引,则AorB不索引、AorC索引、AorBandC索引,
5、数据类型:如果列时字符串类型,数值必须是‘’括起来的,否则类型不一致,不走索引,
6、不等于!=:在主键上走索引,非主键不走索引,
7、大于号>:主键或者数字列走索引,其他不走索引,
8、排序order…by:根据索引排序的时候,如果映射不是索引,则不走索引,除非排序的是主键,
9、尽量少的使用select *,select列越少越好,
10、尽量少使用不规则长度的数据类型:如varchar,检索效率低,
11、经常使用多个条件查询时,使用组合索引比多个单独索引的效率高,
12、尽量使用端索引,
13、索引散列值,即数值重复的少,不适合建索引,
- like '%xx' select * from tb1 where name like '%cn'; - 使用函数 select * from tb1 where reverse(name) = 'wupeiqi'; - or select * from tb1 where nid = 1 or email = 'seven@live.com'; 特别的:当or条件中有未建立索引的列才失效,以下会走索引 select * from tb1 where nid = 1 or name = 'seven'; select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex' - 类型不一致 如果列是字符串类型,传入条件是必须用引号引起来,不然... select * from tb1 where name = 999; - != select * from tb1 where name != 'alex' 特别的:如果是主键,则还是会走索引 select * from tb1 where nid != 123 - > select * from tb1 where name > 'alex' 特别的:如果是主键或索引是整数类型,则还是会走索引 select * from tb1 where nid > 123 select * from tb1 where num > 123 - order by select email from tb1 order by name desc; 当根据索引排序时候,选择的映射如果不是索引,则不走索引 特别的:如果对主键排序,则还是走索引: select * from tb1 order by nid desc; - 组合索引最左前缀 如果组合索引为:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引 - 避免使用select * - count(1)或count(列) 代替 count(*) - 创建表时尽量时 char 代替 varchar - 表的字段顺序固定长度的字段优先 - 组合索引代替多个单列索引(经常使用多个条件查询时) - 尽量使用短索引 - 使用连接(JOIN)来代替子查询(Sub-Queries) - 连表时注意条件类型需一致 - 索引散列值(重复少)不适合建索引,
另外:
无索引的列进行检索时,应用的是全表扫描方式,扫描到结果后继续扫描,直至全文扫描完毕,耗时长,
可以使用limit n提高全表扫描的效率,相当于查到指定的n个结果后,结束扫描,
浙公网安备 33010602011771号