当前位置: 移动技术网 > IT编程>数据库>Mysql > 从四个方面讲解mysql数据库优化

从四个方面讲解mysql数据库优化

2018年12月20日  | 移动技术网IT编程  | 我要评论

优化包括四个方面

1.的优化

2.数据库查询的优化

3.大型存储方面优化

4.索引方面优化

几条mysql小技巧

1、sql语句中的关键词最好用大写来书写,第一易于区分关键词和操作对象,第二,sql语句在执行时,mysql会将其转换为大写,手动写大写能增加查询效率(虽然很小)。 2、如果我们们经对数据库中的数据行进行增删,那么会出现数据id过大的情况,用alter table tablename auto_increment=n,使自增id从n开始计数。 3、对int类型添加 zerofill 属性可以对数据进行自动补0 4、导入大量数据时最好先删除索引再插入数据,再加入索引,不然,mysql会花费大量时间在更新索引上。 5、创建数据库书写sql语句时 ,我们可以在ide里创建一个后缀为.sql的文件,ide会识别sql语法,更易于书写。更重要的是,如果你的数据库丢失了,你还可以找到这个文件,在当前目录下使用/path/mysql -uusername -ppassword databasename < filename.sql来执行整个文件的sql语句(注意-u和-p后紧跟用户名密码,无空格)。

数据库设计方面优化

1、数据库设计符合第三范式,为了查询方便可以有一定的数据冗余。

2、选择数据类型优先级 int > date,time > enum,char>varchar > blob,选择数据类型时,可以考虑替换,如ip地址可以用ip2long()函数转换为unsign int型来进行存储。

3、对于char(n)类型,在数据完整的情况下尽量较小的的n值。

4、在建表时用partition命令对单个表分区可以大大提升查询效率,mysql支持range,list,hash,key分区类型,其中以range最为常用,分区方式为:

create table tablename{

}engine innodb/myisam charset utf8 //选择数据库引擎和编码

partition by range/list(column),//按范围和预定义列表进行分区

partition partname values less than /in(n),//命名分区并详细限定分区的范围

5、选择数据库引擎时要注意innodb 和 myisam的区别。

存储结构:myisam在磁盘上存储成三个文件。而innodb所有的表都保存在同一个数据文件中,一般为2gb

事务支持:myisam不提供事务支持。innodb提供事务支持事务。

表锁差异:myisam只支持表级锁。innodb支持事务和行级锁。

全文索引:myisam支持 fulltext类型的全文索引(不适用中文,所以要用sphinx全文索引引擎)。innodb不支持。

表的具体行数:myisam保存有表的总行数,查询count(*)很快。innodb没有保存表的总行数,需要重新计算。

外键:myisam不支持。innodb支持

索引方面优化

1、innodb是聚簇索引,存储索引时必须有主键,如果没有指定,引擎会自动生成一个隐藏的主键,生成一个主索引,索引内存放的是主键的物理地址,数据靠主键存放,每次使用索引时要先找到主索引,然后找到主索引下的数据。

优点通过主键查找特别快,缺点是次级索引会变慢,因为需要先通过次级索引(次级索引里是主索引的位置。)找到主索引,然后通过主索引找数据。并且如果主键无规律,插入新值时需要移动较多数据块,会影响效率,所以要尽量使用有规律递增的int型做主键。还有因为数据紧跟着主键放,所以如果数据中有数据量特别大的列(text/blob),innodb查询时会跳过很多数据块,也会导致慢。

2、myisam的索引各个索引都相同统一指向磁盘上各个行的地址,都是轻量级的指针数据。缺点是各个索引的建立不是通过主键,查询没有聚簇索引查找主键快。但其因为存储的是地址,所以在插入新值时比较方面移动改变。

3、进行多条件查询时,对多条件分别建立索引时,执行sql查询时,mysql只会选择一个最贴近的索引来使用,所以如果需要多条件查询,要建立联合索引,即使会造成数据冗余。

联合索引的btree建立方法:对第一个条件建立索引,在第一个索引的btree区域对第二个条件建立索引,以此类推,所以,在使用索引时,不用第一个条件用第二个条件也不会用到联合索引。使用索引时要条件要有顺序,有序列的使用。

4、索引长度对查询也有很大影响,我们应该尽量建立短的索引长度,我们可以使用查询列

select count(distinct left(column)) / count(*) from tablename 来测试对column列建立索引时选取不同的长度,索引的覆盖率有多大,我们选择一下接近饱和的n个长度来建立索引

alter table tablename add index (column(n)); 来对某一列的前n个字符建立索引。若前n个字符相同,我们甚至可以对字符串进行反转存储,然后建立索引。

5、对于经常修改导致的索引碎片的维护方式:alter table tablename engine oldengine;即再次应用一下表存储引擎,使其自动维护;也可以用 optimize tablename 命令来进行维护。

数据查询方面优化

数据库操作尽量少查询,有查询时尽量不在数据库层面上进行数据操作,而是返回到php脚本中操作数据,减轻数据库压力。

一旦发现有数据库性能问题,要及时解决,一般用慢查询日志记录查询很"慢"的语句,用explain分析查询和索引使用情况,用profile分析语句执行时的具体资源消耗。

慢查询日志:

1、在my.ini或my.cnf的[mysqld]下添加

slow_query_log_file=/path //设置日志存储路径

long_query_time=n //设置如果语句执行时间达到n秒,就会被记录下来

2、然后在mysql里设置set slow_query_log='on'来开启慢查询。

3、记录下日志后,我们用/bin/目录下的mysqldumpslow filename来查看日志,其常用参数如下:

-g pattern 使用正则表达式

-t n返回前n条数据

-s c/t/l/r 以记录次数/时间/查询时间/返回记录数来排序

explain语句

使用方法,在要执行的查询语句前面加explain

explain select * from user;

得到形如下图的结果:

\

下面是对每一项的解释:

id 查询语句的id,简单查询无意义,多重查询时可以看出执行查询的顺序

select-type 执行的查询语句的类型,对应多重查询,有simple/primary/union等。

tabel 查询语句查询的数据表

type 获得数据的类型 常见的类型效率从高到低为 null>const>eq_ref>ref>range>index>all

possible-keys:可能使用到的索引

key 使用到的索引

key_len索引长度

ref 使用哪个列与索引一起从表中选择。

rows 查找到数据要扫描的大概行数,可看出索引的优劣

extra 常见的有

using filesort 查询到数据后进行文件排序,较慢,需要优化索引

using where 读取整行数据后进行判断过滤,是否符合where条件

using index 索引覆盖,即在牵引中已经有这存储了目标数据,直接读取索引,很快。

profile

用select @@frofiling来查看profile的开启状态。

如果未开启,用set profiling=1来开启。

开启之后,再执行查询语句,mysql会自动记录profile信息。

应用show profiles查看所有的sql信息,结果为 query_id duration query三列结果,分别是查询id,用时和所用的sql语句。

我们可以使用

show pfrofile [type[,type]][for qurey query_id][limit rwo_count [offset offset]]

type常见有all(全部) block io(显示io相关开销) cpu(cpu开销) memory(内存开销)等

大型存储方面优化

数据库主从复制和读写分离

1、master将改变记录到二进制日志中,slave将master的二进制拷贝到它的中继日志中,重新将数据返回到它自己的数据中,达到复制主服务器数据的目的。

主从复制可以用作:数据库负载均衡、数据库备份、读写分离等功能。

2、配置主服务器master

修改my.ini/my.conf

[mysqld]

log-bin=mysql-bin //启用二进制日志

server-id=102 //服务器唯一id

3、配置从服务器slave

log-bin=mysql-bin //启用二进制日志

server-id=226 //服务器唯一id

4、在主服务器上授权从服务器

grant replication slave on *.* to 'slavename'@'ip' identified by 'root'

5、在从服务器上使用

change master to

master_host="masterip",

master_user="masteruser",

master_password="masterpasswd";

6、然后使用start slave命令开始进行主从复制。

不要忘记在每次修改配置后重启服务器,然后可以在主从服务器上用show master/slave status查看主/从状态。

实现数据库的读写分离要依赖mysql的中间件,如mysql_proxy,atlas等。通过配置这些中间件来对主从服务器进行读写分离,使从服务器承担被读取的责任,从而减轻主服务器的负担。

数据库的sharding

在数据库中数据表中的数据量非常庞大的时候,无论是索引还是缓存等压力都很大,对数据库进行sharding,使之分别以多个数据库服务器或多个表存储,以减轻查询压力。

方式有垂直切分、水平切分和联合切分。

垂直切分:在数据表非常多的时候,把数据库中关系紧密(如同一模块,经常连接查询)的表切分出来分别放到不同的主从server上。

水平切分:在表不多,而表里的数据量非常大的时候,为了加快查询,可以用哈希等算法,将一个数据表分为几个,分别放到不同的服务器上,加快查询。水平切分和数据表分区的区别在于其存储介质上的不同。

联合切分:更多的情况是数据表和表中的数据量都非常大,则要进行联合切分,即同时进行垂直和水平分表,将数据库切分为一个分布式的矩阵来存储。

这些数据库的优化方式,每一种拿出来都可以写作一篇文章,可谓是博大精深,了解并记忆了这些方式,可以在有需要的时候进行有目的的选择优化,达到数据库效率的高效。

如对本文有疑问, 点击进行留言回复!!

相关文章:

  • MySQL InnoDB表空间加密示例详解

    前言从 mysql5.7.11开始,mysql对innodb支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数... [阅读全文]
  • 如何解决mysql无法关闭的问题

    如何解决mysql无法关闭的问题

    mysql关闭不了的解决办法:右键点击电脑的任务栏,打开任务管理器点击服务,找到mysql服务右键点击该服务,选择停止就可以了内容扩展:mac系统mysqld进... [阅读全文]
  • mysql不是内部命令的错误解决方案

    mysql不是内部命令的错误解决方案

    出现mysql不是内部命令的错误是因为没有把mysql的bin目录路径添加到环境变量中解决方法:打开电脑的环境变量,选择系统变量,打开path,将mysql的b... [阅读全文]
  • 关于MySQL主从复制的几种复制方式总结

    关于MySQL主从复制的几种复制方式总结

    异步复制mysql的复制默认是异步的,主从复制至少需要两个mysql服务,这些mysql服务可以分布在不同的服务器上,也可以在同一台服务器上。mysql主从异步... [阅读全文]
  • 详细分析MySQL主从复制

    详细分析MySQL主从复制

    前言:在mysql中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习mysql过程中必不可... [阅读全文]
  • MySQL单表恢复的步骤

    正休息的时候一个电话将我的睡意完全打散,“开发童鞋写update sql的时候忘了加where条件了”,相信每一个dba同学听到这个消息的时候都有骂街的冲动吧。... [阅读全文]
  • MySQL性能优化之如何高效正确的使用索引

    实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作... [阅读全文]
  • MySQL如何优化查询速度

    前面章节我们介绍了如何选择优化的数据类型、如何高效的使用索引,这些对于高性能的mysql来说是必不可少的。 但这些还完全不够,还需要合理的设计查询。 如果查询写... [阅读全文]
  • MySQL优化SQL语句的技巧

    在面对不够优化、或者性能极差的sql语句时,我们通常的想法是将重构这个sql语句,让其查询的结果集和原来保持一样,并且希望sql性能得以提升。而在重构sql时,... [阅读全文]
  • 简述MySql四种事务隔离级别

    隔离级别:隔离性其实比想象的要复杂。 在sql标准中定义了四种隔离级别, 每一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通... [阅读全文]
验证码:
移动技术网