MySQL相关

1.索引设计原则

  • 最适合设计索引的地方是where后面的字段,或者连接字句中指定的列。
  • 使用唯一索引
  • 使用短索引。比如char(200)的列,不需要将全部字符当成索引,可以只对前面10或者20个字符进行索引。较小的索引涉及的磁盘IO比较少,查询速度比较快,内存也能存储更多键值。
  • 尽量使用主键或者唯一约束

2.存储过程与函数

  • 存储过程与函数是事先经过编译并存储在数据库中的一段SQL语句集合,能减少数据在数据库与应用服务器之间的传输。
  • 函数必须有返回值,存储过程没有。
  • 存储过程参数可以使用in,out,inout,而函数只能用in

3.触发器

  • 只能建在永久表上(create trigger)
  • 对于有重复记录,需要进行update操作的insert,触发器触发顺序是before insert,before update,after update。对于无重复的before insert,after insert。

4.事务控制和锁定语句

  • 如果只需要对部分语句进行事务控制,使用start transaction,这样事务结束后会变回自动提交方式。会造成一个隐含的unlock tables。
  • 如果希望所有事务都不是自动提交的,使用set autocommit=0修改成手动提交。
  • 事务中可以通过定义savepoint,指定回滚事务的一个部分,但是不能指定提交事务的一个部分。

5.分布式事务

MYSQL中分布式事务涉及一个或多个资源管理器和一个事务管理器。数据库服务器就是一种资源管理器。

6.SQL分区

分区是一张表,但是每个表都是独立的对象,可以独自处理。

分区的特点:

  • 与单个磁盘或者文件系统比,可以存储更多数据。
  • 可以优化查询。可以只扫描一个或者多个表,在统计sum(),count()等聚类查询时,先在各个分区进行处理,然后再汇总所有得到最终结果。
  • 对不需要的表数据可以直接删除与之相关的分区。
  • 跨多个磁盘进行分散查询,以获得更大的查询吞吐量。

分区类型:

  • range分区:基于一个给定的连续区间范围,把数据分配到不同的分区。
  • list分区:基于枚举出的值列表分区。
  • hash分区:基于给定的分区个数,把数据分配到不同的分区。
  • key分区:

7.SQL优化

优化SQL语句的一般步骤:

  • show status了解各种SQL语句的执行频率。
  • 通过满查询日志和show processlist定位执行效率较低的SQL语句。
  • 通过explain分析低效率SQL语句的执行计划。
  • 通过show profile分析SQL

索引问题:

MYSQL中能使用索引的典型场景:

  • 匹配全值(where后面有=的匹配值)
  • 匹配值的范围查询,对索引的值能进行范围查询。(> /<)
  • 匹配最左前缀
  • 仅仅对索引进行查询

存在索引但不使用索引的情况:

  • 以%开头的like查询不能利用B-Tree索引
  • 数据类型出现隐式转换的时候
  • 复合索引情况下,假如查询条件不包含索引最左边部分。
  • 用or时,如果or前面有索引列,后面没有时

两个简单优化表的方法:

  • 定期分析表analyzed table。分析执行计划是否是预期的实行计划。
  • 检查表check table。检查表是否有错误比如说一个视图,在视图中被引用的表已经不存在了。
  • 定期优化表,如果对可变长度行的表进行了很多修改,此时会产生很多空间碎片。用optimize进行空间碎片合并,并且可以消除由于删除或者更新造成的空间浪费。

 常用的SQL优化

  • https://www.cnblogs.com/yycc/p/7518240.html
  • 大批量插入数据:alter table table_name disable keys   *******************************alter table table_name enable keys
  • 导入数据前set unique_checks=0,关闭唯一性校验。结束后set unique_checks=1。
  • 关闭自动提交set autocommit=0
  • 优化group by语句。

优化数据库对象

  • 垂直拆分。如果某些列常用,而某些列不常用,则可以采用垂直拆分。垂直拆分可以使数据行变小,一个数据页可以存放更多数据,查询时会减少i/o次数。缺点是数据冗余。
  • 水平拆分
posted @ 2018-06-24 10:13  jokermo  阅读(86)  评论(0编辑  收藏  举报