desc userinfo 3;  # 显示所有列

 

普通索引:

  index 索引名(列名)  # 创建表的时候

  creat index 索引名 on 表名(列名)

  drop index 索引名 on 表名

唯一索引:

  unique 索引名(列名)  # 创建表的时候

  creat unique index 索引名 on 表名(列名)

  drop unique index 索引名 on 表名

联合(组合)索引: 

  creat index 索引名 on 表名(列名,列名)  # unique同理

  drop index 索引名 on 表名

主键:

  primary key (列名)

  alter table 表名 add primary key(列名)  # 后天创建

 

作用:

  约束

  加速查找

索引:

  普通索引:加速查找

  主键索引:加速查找 + 不能为空 + 不能重复

  唯一索引:加速查找 + 不能重复

  联合索引(多列):

    联合主键索引

    联合唯一索引

    联合普通索引

    最左前缀匹配

加速查找:

  select * from tb1 where name = 'asd'

  select * from tb1 where id = 999

  无索引:从前到后依次查找

  索引:

     创建以某种格式存储的额外文件

     查询快,插入更新删除慢

     命中索引

  

  索引种类(某种格式存储):

    hash索引:

      单值速度快

      取范围速度慢(顺序被打乱)

    btree索引:

      二叉树(默认,速度快)

覆盖索引:

  select email fron tb1 where email = ''

  在索引文件中直接获取数据,不去表里取

索引合并:  

  select email fron tb1 where email = '' and id = 999

  把多个单列索引合并使用

  # 没有组合索引效率高,经常用应该用组合

 

索引命中:

  like 效率低,数据量大的时候一般用第三方工具

  尽量不要用函数 类似reverse(name)

  or后面没索引的话会未命中,索引 or 非索引 and 索引会命中

  数据类型不一致会未命中降低效率(查找条件和数据本身类型)

  普通索引 != 会效率低,主键不会

  >会降低效率,主键或整数类型索引不会

  order by:根据索引排序的时候,如果选择的映射不是索引,会未命中,主键除外

  联合索引最左匹配

 

注意事项:

  避免使用select *

  count(1)或count(列)代替count(*)

  尽量用char代替varchar

  表的字段顺序固定长度的字段优先

  组合索引代替多个单列索引(经常使用多个条件查询时)

  尽量使用短索引  # creat index 索引 on tb(title(8))  text这种必须指定长度

  使用join代替子查询

  连表时注意条件类型需一致

  索引散列值(重复少)不适合建索引,比如性别

 

执行计划:

  预估执行操作

  exlpain select * from userinfo3; 

  type:ALL (全表扫描)

  type:ref   (走了索引)

  性能:

    all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

    limit是特殊情况(limit 1)速度快

 

慢日志:

  内存:

    show variables like 'query'

    set global 变量名 = 值

    slow_query_log = OFF

    long_query_time = 2

    slow_query_log_file = /usr/slow.log

    log_queries_not_using_indexes = OFF

  配置文件:

    mysqld --defaults-file = 'D:\my.conf'

    mydefault.ini  # 修改配置文件之后需要重启服务,注意备份

  

分页:

  limit 0,10这种数据量大的时候效率低

  索引表中扫,速度提升有限

  考虑到id不连续问题,所以不能用between and 

  最优方案,记录当前页最大最小ID结合python语句:

    1.页面只有上一页,下一页

      select * from userinfo where id > max_id limit 10;

      select * from userinfo where id < min_id order by id desc limit 10;

    2.上一页  192 193 [194] 195 196 197 下一页

      想看197

      select * from userinfo where id in (

        select id from (select id from userinfo where id > max_id limit 30) as N order by N.id desc limit 10)

      )