欢迎访问个人我的博客:www.ifueen.commysql
关于MySQL的优化,大致方案能够分为如下步骤web
首先要明白原理,实际上咱们在数据库上面所作的操做都会被日志记录下来,咱们在定位慢查询就须要去经过日志记录来找到究竟是哪条SQL效率慢算法
查询数据库状态的命令sql
运行了多久 show status like 'uptime'; CRUD的执行次数 show status like '%Com_select%' show status like '%Com_insert%' show status like '%Com_update%' show status like '%Com_delete%' 查询全部的链接数 show status like 'connections' 查询慢查询次数(数据库默认是10S,能够经过命令设置) show status like 'slow_queries' 查看和修改慢查询时间阈值 show variables like ‘long_query_time’ ; //能够显示当前慢查询时间 set long_query_time=1 ;//能够修改慢查询时间
由于咱们的SQL服务默认是没有开启满记录日志的,因此咱们并不能查看慢查询相关的记录,须要咱们手动开启数据库
进入到mysql文件夹下的bin目录,经过cmd运行如下命令:mysqld.exe --safe-mode --slow-query-log性能优化
就能够开启慢查询记录的日志数据结构
慢记录日志的默认输出地址在my.ini文件中,一般默认是在C盘数据库设计
慢记录通常都会在开发和测试阶段开启,不要等到上线后再去检查svg
经过 explain 语句能够分析Sql语句性能
这是数据库在设计之初咱们默认都要遵照的规则
第一范式:数据表中的列是不可分割的一个总体
第二范式:表中的记录都须要一个惟一标识(一般是主键)
第三范式:表中不要有冗余数据,大致意思就是一张表中不能出现另外一张表除主键以外的字段
反三范式设计
有时候为了提升效率,有时候就必需要经过反三范式来进行设计,适当的保留冗余数据
对于存储设计,咱们一般有两种方式来进行设置
定长:会根据数据的类型来进行空间的分配,是固定的
边长:根据存储数据的大小来,用多少就分配多少
数据库的存储引擎分类:Innodb,MyISAM
首先咱们要弄清楚一个概念:什么是索引,何时用索引?
索引是数据库优化的时候最物美价廉的东西,官方概念称是帮助MySQL提升查找效率的一种数据结构,可以帮咱们快速的定位查找到相应的位置
咱们通常在数据量过多的表中或者须要查询频率比较高的字段上加上索引
注意:对于增删改操做比较多的字段,不建议使用索引,即便查询频率较高
MyISAM和Innodb都只支持Btree索引算法,而MEMORY/HEAP同时支持Btree和HASH算法
此外,咱们害能够建立复合索引(多列索引,就是在多个列上面建立同样的索引
分表的方式有垂直分表和水平分表两种
垂直分表是根据字段进行分表,咱们一般会遇到这种需求,有些表记录的数据并非不少,可是字段却很是的多,每次查询起来会执行大量的I/O,影响性能,这时候咱们就能够进行垂直分表
好比:如今一个用户有许多字段信息,可是有些又不太经常使用,就能够经过id,把姓名,电话,地址等分一个表,把签名,收藏等经过id进行垂直分表,分为另外一张表,两张表的id是同一个
水平分表是根据记录来进行分表,若是一个表的记录太多的话,不用想,天然会影响到查询的效率,好比上千万条,并且须要常常检索,那么咱们就有必要进行水平分表了
水平分表其实很好理解,好比一个一千万记录的表,咱们能够根据记录数分红十张一百万的表,第一张就是一到一百万,一次日后…
有时候会遇到这种需求,加入须要查询第五百万条到第八百三十二万条怎么办呢,这时候咱们能够用UNION和UNION ALL来把结果集进行联合
水平分表中的id咱们能够经过主键自增、UUID、雪花算法等来进行求出
最简单的一种hash算法:t_user+id%100(分表数)+1
将多条结构相关的sql语句合并味一条