mysql优化知识记录

mysql 优化mysql


1.mysql优化是一个综合性的,主要方向包括
    a:表的设计要符合三范式(3NF)
    b:添加适当的索引(index)四中常见索引:普通索引、主键索引、惟一索引unique、全文索引
    c:分表技术(水平分割、垂直分割)
    d:读写(update/delete /add)分离技术
    e:存储过程 
    f:对mysql配置优化(对配置最大并发数修改 my.ini文件 max_connection通常调整到1000左右、调整缓存大小)
    g:mysql服务器硬件升级
    h:定时清除不须要的数据,定时进行碎片整理(MyISAM存储引擎)sql


2.sql语句自己的优化
    问题是:如何从一个大项目中,迅速的定位执行速度慢的语句?定位慢查询
    ①首相了解mysql数据库的一些运行状态如何查询(好比当前mysql运行的时间/一共执行了多少次select语句/当前链接数等)
    show status   //显示状态
    show [session|global] status like ……   //默认是session 指的是取出当前窗口执行的次数
    show status like 'com_select'   //显示执行了多少次select语句
    show status like 'connections'  //显示链接数
    show status like 'slow_queries'  //显示慢查询次数
    步骤:①显示mysql的慢查询时间默认值单位是秒
        show variables like 'long_query_time'
          ②修改mysql的慢查询时间默认值
        set long_query_time=1数据库

    如何启动慢查询日志?记录查询过的慢查询语句
        默认状况下mysql不记录慢查询,须要在启动时指定参数
        启动mysql的命令:    bin\mysql.exe --safe-mode --slow-query--log
        生成日志文件在my.ini中的datadir指定的路径下缓存


    3.添加索引
    1.主键
        添加索引
       方式a:    create table tableName(id int unsigned primary key auto_increment,name varchar(32
                    not null default '');
       方式b:    alter table tableName add primary key (列名);
    2.普通索引
        添加索引
        create table tableName (
            id int unsigned
            name varchar(10) not null default ''
        )
        create index 索引名 on 表名(列名)安全

    3.全文索引
        全文索引主要是针对对文本的检索好比文章。
        添加索引
        create table tableName(
            id int unsigned primary key auto_increment,
            title varchar(200),
            body TEXT,
            FULLTEXT(title,body)
        )engine=myisam charset utf8;服务器

        如何使用全文索引
        错误的用法:
        select * from tableName where body like '%mysql%';【不会使用全文索引】
        正确的使用方法
        select * from tableName where match(title,body) against('querycharacter');session

        说明:
        a.在mysql中fulltext索引只针对myisam生效
        b.mysql本身提供的fulltext只针对英文生效,要处理中文可使用sphinx()
        c.使用方法是使用match(字段名……)
        mysql优化

    4.惟一索引
        添加索引
        方式a:  当表的某列被指定为unique约束时,这就是一个惟一索引
            create table tableName(
                id int unsinged primary key auto_increment,
                name varchar(32) unique
            )engine = innodb charset utf8;并发

        这是name列就是一个惟一索引,unique字段能够为null,能够多个 
        方式b:
            create table tableName(
                id int unsinged primary key auto_increment,
                name varchar(32)
           )engine = inodb charset utf8;
        create unique index 索引名 on 表名(列名)优化


        删除索引
        alter table tableName drop index indexName

        查询索引
        show index from tableName 


4.索引的注意事项
    a.占用磁盘
    b.对dml语句有影响,会变慢,由于dml语句会影响btree。


5.什么时候何地添加索引
    a.频繁的做为查询条件的字段应该建立索引
    b.惟一性太差的字段不适合做为索引,由于构建的btree不优秀,例如性别字段
    c.更新很是频繁的字段不适合创建索引,dml语句会重建btree。
    d.不出如今where中的字段不该该创建索引

6.应该建立索引总结:
    a.确定在where条件中常用,
    b.该字段的内容不是惟一的几个值例如gender
    c.字段内容不是常常变化的


7.sql语句中使用索引时的注意
    a.当sql中使用复合索引时,当条件语句中的字段是复合索引字段最左边的字段就会使用索引
不然不会使用。explain sql语句 能够帮助咱们不真正的执行sql语句,去看mysql的执行计划。从为去
优化sql 状况。
    b.对于使用like查询,若是‘%’写在前面,是不会使用索引。非要使用%在前,那就只能不使
用索引,或者使用全文索引sphinx
    c.若是条件中有or,使用的全部字段都必须创建索引才能使用索引,不然不会使用索引建议大
家尽可能避免使用or,or的效率不高。
    d.若是列是字符串,查询时,使用单引号引发可使用索引,不使用不会使用索引
    e.若是mysql发现扫描全表比使用索引快时,就不会使用索引。

8.如何查看索引使用的状况
    show status 'handler_read%';
    值越高越好

9.经常使用sql优化
    a.group by 会对分组的数据作默认排序,当业务不须要排序时,能够把order by null
    b.不少时候使用左链接比使用子查询效率要高


10.存储引擎选择
    myisam存储:对事务要求不高,同时是以查询和添加为主的。好比评论回复表
    INNODB存储:对事务要求高,保存数据重要。好比订单表,帐号表
    Memory存储:好比咱们数据变化频繁,不须要入库,同事有频繁的查询修改。


11.myisam和innodb的区别
                      myisam              innodb
    批量插入       高                        低
    事务安全      不支持                支持
    全文索引       支持                  (5.5以后)支持
    锁机制          表锁                    行锁
    外键           不支持                   支持

 

12.碎片整理
    若是数据库引擎是myisam的须要定时作碎片整理。
    例如:
    create table tableName (
        id int unsigned primary key auto_increment,
        name varchar(100) not null default '' 
    )engine=myisam charset utf8;

    insert into tableName values('aaa');

    delete from tableName where id = 1;

    使用delete语句并无真实删除数据,在这种状况下,咱们应该定时对myisam进行整理。
    命令:optimize table tableName;


题外话,技术就是窗户纸,捅破了,就简单了,因此要常常与大神交流,为此,我辞职了……


13.数据库备份
    a.手动备份
       cmd控制台    mysqldump -u root -proot 数据库[表名1,表名2……]  >文件路径
        mysqldump -u root -proot temp >d:\temp.bak
        若是但愿备份的是数据库的某几张表    

    b.自动备份
        把备份数据库的指令写入到bat文件里,而后经过任务调度器定时调用bat文件


    c.使用备份文件恢复数据
        mysql 控制台 source 备份文件路径 例如 source d:\temp.dept.bak

    
14.mysql配置文件优化

    修改         a.端口号         b.最大链接数通常1000         c.innodb的缓存(通常扩大10倍)innodb_addition_mem_pool_size=64M     innodb_buffer_pool_size=1G,对于myisam,须要调整key_buffer_size。     

相关文章
相关标签/搜索