MySQL简单优化

Posted 蚂蚁力量

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL简单优化相关的知识,希望对你有一定的参考价值。

1:对 mysql 优化是一个综合性的技术,主要包括:
    a、标的设计合理(符合 3NF)
    b、添加适当索引(index)(普通索引、主键索引、唯一索引 unique、全文索引)
    c、分表技术(水平分隔、垂直分隔)
    d、读写(写delete/update/add)分离
    e、存储过程(模块化编程,可以提高速度)
    f、对 MySQL 配置优化(配置最大并发数,调整缓存大小)
    g、MySQL 服务器硬件升级
    h、定时的清除不需要的数据,定时进行碎片整理(myISAM)
2:什么样的表才是符合 3NF(范式)
    表的范式,是首先符合 1NF,才能满足 2NF,进一步满足 3NF。
    2.1:1NF:即表的列具有原子性,不接在分解,即列的信息粉能分解,只要数据库是关系型数据库(mysql、oracle、db2、informix、sysbase、sql sever),就自动满足 1NF。
        所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
        数据库的分类:
        关系型的数据库:mysql、oracle、db2、informix、sysbase、sql sever
        非关系型数据库:特点:面向对象或者是集合
        NoSql数据库:MongoDB(特点是面向文档)
    2.2: 2NF:表中的记录是唯一的,就满足 2NF,通常我们设计一个主键来实现。 
        第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
要求实体的属性完全依赖于主关键 字,简而言之,第二范式就是非主属性非部分依赖于主关键字。
主键不含业务逻辑
    2.3: 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性。
        3NF:即表中不要有冗余,就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个来存放,比如下面的表就不满足
 技术分享应当为:技术分享
    反 3NF:但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低凡是标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
 
3:SQL 语句优化
    问题:如何从一个大项目中迅速的定位执行速度慢的语句(定位慢查询)
    ①首先我们要了解 MySQL 数据库的一些运行状态如何查询(比如想知道当前MySQL运行时间、一共运行了多少次select/update/delete。。、当前链接)
        常用 执行命令:
            show status like "uptime";        //开启了多长时间
            show status like "com_select"(come_delet\com_update);    //执行了多少次查询(删除,添加)
            show [session | global] status like ...  如果不写[session | global] 默认是session(当前)会话,指去除当前窗口的执行,如果想看所有(从MySQL启动到现在,则应该加入 global)
            show status like "connections";            //试图链接MySQL服务器的次数
            show status like "slow_queries";           //显示慢查询次数
    ②如何定位慢查询
            在默认情况下,MySQL认为 10秒才是一个慢查询
            修改 MySQL 的慢查询时间:
                a、show variables like "long_query_time"(查询默认慢查询时间)
                b、set long_query_time=1;(设置慢查询时间为一秒,重启mysql会恢复到10s)
            修改命令执行结束符:delimiter +$$(结束符)
            如果把慢查询的sql记录到我们的一个日志中,在默认情况下,我们的mysql不会记录慢查询,需要重启mysql时候,指定慢查询才行
    数据库有各种数据对象(表,存储过程,视图,函数,触发器)
            先关闭mysql在启动,如果启用了慢查询日志,默认吧这个文件放到my.ini文件中记录的位置(datadir="");
            启用慢查: --safe-mode (安全模式)
            技术分享
        
    优化问题:
        1、添加索引(全文索引/唯一索引/主键索引/普通索引)
            ①主键索引:当一张表,把某个列设为主键,则该列表就是主键索引
           如果在创建表的时候,没有指定主键索引,也可以在创建表后,再添加
                命令:alter table 表名 add primary key(列明);
                例:create table abc (id int, name varchare(32) not null default "");(无索引)
                       alter table abc add primary key (id); (添加索引)
                数据库添加索引会有一定的内存开销,在 data 中会生成三种文件:
                技术分享   
                    .frm:表示表结构
                    .MYD:表示表数据
                    .MYI:表示表索引
        2、查询索引:
             ①desc 表名【该方法的缺点:不能显示索引名】
             ②show index(es) from 表名
             ③show key from 表名 

 

以上是关于MySQL简单优化的主要内容,如果未能解决你的问题,请参考以下文章

简单化MySQL优化小妙招

MySQL初始化简单优化

简单的方式优化mysql

mysql 的简单优化

mysql优化三 (两个简单实用的优化方法)

MySQL简单优化