mysql优化

--------------------韩顺平笔记整理


  • 要保证数据库的效率,要做好以下四个方面的工作:
  1.  数据库设计
  2.  sql语句优化
  3.  数据库参数配置
  4.  恰当的硬件资源和操作系统

  • 数据库表设计

    1. 1NF :就是具有原子性,不可分割.(只要使用的是关系性数据库,就自动符合)

    2. 2NF: 在满足1NF 的基础上,我们考虑是否满足2NF: 只要表的记录满足唯一性,也是说,你的同一张表,不可能出现完全相同的记录, 一般说我们在 表中设计一个主键即可.

    3. 3NF: 在满足2NF 的基础上,我们考虑是否满足3NF:即我们的字段信息可以通过关联的关系,派生即可.(通常我们通过外键来处理)

    1. 逆范式: 为什么需呀逆范式.

      (相册的功能对应数据库的设计)

      适当的逆范式.


      不适当的逆范式



      SQL语句优化 
      1.sql语句优化的一般步骤
      ①通过show status命令了解各种SQL的执行频率。
      ②定位执行效率较低的SQL语句-(重点select)
      ③通过explain分析低效率的SQL语句的执行情况
      ④确定问题并采取相应的优化措施

      2.show status命令
      该命令可以显示你的mysql数据库的当前状态.我们主要关心的是 “com”开头的指令
      show status like ‘Com%’ <=> show session status like ‘Com%’ //显示当前控制台的情况
      show global status like ‘Com%’ ; //显示数据库从启动到 查询的次数

      3.显示查看慢查询的情况:

      3.1show variables like ‘long_query_time’

      3.2启动慢查询 启动 xx>bin\mysqld.exe –slow-query-log

      4.索引的原理

      4.1

      4.2 介绍一款非常重要工具 explain, 这个分析工具可以对 sql语句进行分析,可以预测你的sql执行的效率.
      他的基本用法是:explain sql语句\G
      //根据返回的信息,我们可知,该sql语句是否使用索引,从多少记录中取出,可以看到排序的方式.

      4.3 在什么列上添加索引比较合适

      ① 在经常查询的列上加索引.
      ② 列的数据,内容就只有少数几个值,不太适合加索引
      ③ 内容频繁变化,不合适加索引

      4.4 索引的种类

      ① 主键索引 (把某列设为主键,则就是主键索引)
      ② 唯一索引(unique) (即该列具有唯一性,同时又是索引)
      ③ index (普通索引)
      ④ 全文索引(FULLTEXT)
      select * from article where content like ‘%李连杰%’;
      hello, i am a boy
      你好,我是一个男孩 =>中文 sphinx

      ⑤ 复合索引(多列和在一起)create index myind on 表名 (列1,列2);

      4.5 如何创建、删除、显示索引

      如果创建unique / 普通/fulltext 索引
      1. create [unique|FULLTEXT] index 索引名 on 表名 (列名...)
      2. alter table 表名 add index 索引名 (列名...)
      如果要添加主键索引
      alter table 表名 add primary key (列...)


      删除索引
      1. drop index 索引名 on 表名
      2. alter table 表名 drop index index_name;
      3. alter table 表名 drop primary key

      显示索引
      show index(es) from 表名
      show keys from 表名
      desc 表名


      4.6使用索引的注意事项

      查询要使用索引最重要的条件是查询条件中需要使用索引。
      下列几种情况下有可能使用到索引:
      1,对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
      2,对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引‘aaa%’ 会使用到索引。
      下列的表将不使用索引:
      1,如果条件中有or,即使其中有条件带索引也不会使用。
      2,对于多列索引,不是使用的第一部分,则不会使用索引。
      3,like查询是以%开头
      4,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。
      5,如果mysql估计使用全表扫描要比使用索引快,则不使用索引

      4.7 如何检测你的索引是否有效

      结论:Handler_read_key 越大越少

      Handler_read_rnd_next 越小越好


      5. MyISAM 和 Innodb区别是什么

      1. MyISAM 不支持外键, Innodb支持
      2. MyISAM 不支持事务,不支持外键.
      3. 对数据信息的存储处理方式不同.(如果存储引擎是MyISAM的,则创建一张表,对于三个文件..,如果是Innodb则只有一张文件 *.frm,数据存放到ibdata1)

      *对于 MyISAM 数据库,需要定时清理optimize table 表名

      因为,MyISAM表在删除数据的时候,数据库文件空间是不会释放的。需要手动通过 optimize 命令来释放表空间。

      6. 常见的sql优化手法

      1. 使用order by null 禁用排序
      比如 select * from dept group by ename order by null

      2. 在精度要求高的应用中,建议使用定点数(decimal)来存储数值,以保证结果的准确性
      1000000.32 万
      create table sal(t1 float(10,2));
      create table sal2(t1 decimal(10,2));

      7.为什么data函数只支持到2038-1-19。跟计算机有关。。。。

      对于32位机器来说,有符号数只能最大支持到 2*31次方-1 这个数次用date计算出来就是2038-1-19.

      8. 表的水平划分

      9. 其它

      如果你的数据库的存储引擎是MyISAM的,则当创建一个表,后三个文件. *.frm 记录表结构. *.myd 数据 *.myi 这个是索引.

      mysql5.5.19的版本,他的数据库文件,默认放在 (看 my.ini文件中的配置.)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章