创建索引
组合索引
ALTER TABLE table_name ADD INDEX index_name(field1, field2, ...);
有某几个字段经常被组合起来作为查询条件,建议将这些字段创建为一个组合索引,而不是每个字段单独创建索引
组合索引使用
假设表A有组合索引idx_abc(a, b, c)
sql1: select * from A where a = 'a'; 用到索引
sql2: select * from A where b = 'b'(或c = 'c'); 没有用到索引
sql3: select a,b,c from A where b = 'b'(或c = 'c'); 用到索引,查询字段在(a,b,c)中可以用到索引
sql4: select a,d from A where b = 'b'(或c = 'c');没有用到索引,查询字段包含(a,b,c)之外的字段,没有用到索引
sql5: select * from A where a = 'a' and b = 'b'; 用到索引
sql6: select * from A where b = 'b' and c = 'c'; 没有用到索引
总结:
- where条件包含组合索引的第一个字段(a),查询字段无论是什么都会用到索引
- where条件不含组合索引的第一个字段(a),但包含组合索引中的其他字段(b,c),只有当筛选的字段仅在组合索引的字段内时才会用到索引,包含其他字段则不会用到索引
组合唯一索引
组合唯一索引与组合索引的区别在于组合唯一索引多了唯一性约束
- mysql的唯一性约束默认对大小写不敏感,如果需要区分大小写,则将字段设为二进制(binary)即可
- 不区分大小写时,ü、u、U是相等的
添加字段
- 若表中有根据当前时间戳更新的datetime字段(last_update_time),添加字段时即使设有默认值,last_update_time值不会变
修改字段
- 修改字段类型时,若表中有根据当前时间戳更新的datetime字段(last_update_time),其时间值不会更新
- 修改字段类型时,若设有默认值,则默认值只对新增数据有效,该字段原有值不会改变。
- 修改原有字段的类型,且重设默认值,需要将原有数据的默认值统一改为新的默认值时,一定要关闭last_update_time的自动更新功能(on update current_timestamp),数据修改玩之后再将last_update_time设为自动更新
- 开启或关闭last_update_time的自动更新功能就像修改表名一样瞬间完成。
增、删多个分区
alter table tb_monitor_task_cn drop partition p9, p10, p11;
alter table tb_monitor_task_cn add partition (partition p8 values less than (10),
partition p9 values less than (11),
partition p10 values less than (12),
partition p11 values less than (13));