MySQL相关
Posted jokermo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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次数。缺点是数据冗余。
- 水平拆分
以上是关于MySQL相关的主要内容,如果未能解决你的问题,请参考以下文章