这里详细说说关于索引的正确使用:

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个结果后,结束扫描,