mysql优化学习笔记

 mysql的优化总结有以下4点

1-数据库(表)设计合理
我们的表设计要符合3NF   3范式(规范的模式) , 有时我们需要适当的逆范式
2-sql语句的优化(索引,常用小技巧.)
3-数据的配置(缓存设大)
4-适当硬件配置和操作系统 (读写分离.)
 
                       1-数据的范式
1NF :就是具有原子性,不可分割.(只要使用的是关系性数据库,就自动符合)
2NF: 在满足1NF 的基础上,我们考虑是否满足2NF: 只要表的记录满足唯一性,也是说,你的同一张表,不可能出现完全相同的记录, 一般说我们在 表中设计一个主键即可.
3NF: 在满足2NF 的基础上,我们考虑是否满足3NF:即我们的字段信息可以通过关联的关系,派生即可.(通常我们通过外键来处理)
逆范式:有时候3NF会出现更多的冗余,我们就应该使用逆范式。
范式的选择是更具实际情况来决定的。当一个列的内容过大,更新平凡时候,我们更倾向于逆范式。
 
                              2-mysql索引优化
um-面试题 :sql语句有几类
 ddl (数据定义语言) [create alter drop]
 dml(数据操作语言)[insert delete upate ]
 select
 dtl(数据事务语句) [commit rollback savepoint]
 dcl(数据控制语句) [grant  revoke]
dois-控台查看sql命令执行效率        
 show status命令
  该命令可以显示你的mysql数据库的当前状态.我们主要关心的是 “com”开头的指令
  show status like ‘Com%’  <=> show session  status like ‘Com%’  //显示当前控制台的情况
  show global  status like ‘Com%’ ; //显示数据库从启动到 查询的次数
 显示连接数据库次数
  show status like  'Connections';
 这里我们优化的重点是在 慢查询. (在默认情况下是10 ) mysql5.5.19
 显示查看慢查询的情况
  show variables like ‘long_query_time’
tres-对mysql索引优化
  对sql语句优化有最方便的就是添加主键了。(主键类似系统替我们分类了,需要的时候直接到某个类别里面找,速度快很多。)
  主键好处就是增加速度,不过主键会增大myi文件的体积(牺牲空间来增加速度,这就是索引)
  怎么才能合理的索引:
   1-经常查询的列上添加索引(where xx=‘’)
   2-唯一性太差的列不要加索引。(比如对性别查询。就2种结果,分类太少) 
   3-列的内容变化很大,(应为索引会去读写.myi文件。变化过于平缓,时间都浪费在读写文件上了)
   4-创建多列的索引(复合索引),先把最左边的进行索引,如果没带入最左边的索引,系统不会添加索引。
   5-对于like语句 like "%c" 是不会被索引的,而 like 'c%'是可以被索引的。   
   6-如果条件里面有or ,那么系统不会使用索引(不过我测试索引参数都是有索引,那么系统会使用索引。)
   7-如果列的类型是字符串类型的,没有加引号(''),那么系统不会使用索引。
   8-如果表的数据很少。我们就不要使用索引了。
   
  索引的种类:
   1-主键索引(primary)把某列设置为主键,他会自动变成主键索引。 
   2-唯一索引(unique),既该列具有唯一性,且是索引。当设置unique时候,系统不会自动添加索引
   3-普通索引(index)
   4-全文索引(FULLTEXT)
   5-复合索引(不是具体的,是多列合在一起)
  如何创建索引:
   1-如果创建是非主键索引:create [unique|fulltext] index 索引名字 on 表名(列名)
   2-如果创建是非主键索引: alter table 表名 add index 索引名字 (列名)
   3-添加主键索引:alter table 表名 add primary key (列名)
  如何删除索引:
   1-删除非主键索引: drop index 索引名 on 表名
   2-删除非主键索引: alter table 表名 driop index (索引名字)
   3-删除主键索引 :alter table 表名 drop primary key
  查询某表的索引:show indexes from 表名;
  查看表的存储引擎:show create table 表名
  查看索引使用情况:
    show status like "Handler_read%"
Handler_read_key 值越高越好
Handler_read_rnd_next 越低越好。
   myisam储存和innodb的区别:
   1- myisam不支持外键。innodb支持外键
   2- myisam不支持事物。innodb支持事物
   3- myisam删除数据的时候,不会释放硬盘空间。(必须定时清理)清除指令:optimize table 表名
      
 
    3-sql语句优化
 1-优化order by 排序
    order 排序在exlain中可以看出是使用using file这样影响速度。
    我们可以这么做:select * from admin order by a,order by null
 2-在某些情况下使用join来替换子查询。子查询会在内存里面创建临时表。
 3-在精确要求高的应用中,使用定点数(decimal)类型来存储。千万别用float(会误差)
         4-分表技术 
1-水平分表,把记录分别储存到不同的数据库里。应用于数据量很大的。
2-
 
 
 
 
 
 
  
                         4-explain使用
  explain是用于测试sql语句的效率。根据返回值,可以得到sql语句是否使用主键,他搜索记录的范围。效率
mysql> explain select * from test2 where id =1 \G
*************************** 1. row ***************
           id: 1  //sql语句使用的索引
  select_type: SIMPLE  //
        table: test2  //查询的表名
         type: const  //有3种情况,all全表查询(最不好),system(这是const连接的一个特例),const(唯一个匹配,速度最好)
possible_keys: PRIMARY,id //可能用到的索引
          key: PRIMARY  //实际用到的索引
      key_len: 4
          ref: const
         rows: 1   //表示从多少记录里面找出,应为索引关系才显示一,如果没索引就是全部记录
        Extra: //查询喜剧信息。no tables(不查表查询) using filesore(如果排序,order by xx不是索引。速度很慢,全表查询)
                //using where (通过索引查询,速度比较好) 
       1 row in set (0.00 sec)

你可能感兴趣的:(mysql学习笔记)