Mysql数据库优化

一、Mysql数据库的优化技术
 对mysql优化是一个综合性的技术,主要包括如下几点:
1.表的设计合理化(满足3NF)
2.添加适当的索引
3.分表技术(水平分割、垂直分割)
4.读写分离
5.存储过程
6.对mysql配置优化
7.mysql服务器硬件升级
8.定时清除无用数据,定时整理MyISAM存储引擎的碎片
二、Mysql数据库优化详解
(一)表的合理化设计之3NF
  1.满足3NF的前提,分别需要满足1NF和2NF

  2.1NF:表的列具有原子性,不可再拆分。
 例:现有表 user(id,age,name,adress),
        1 18 张三 江西省九江市
  即此 表便满足1NF,可能有人会疑惑adress字段不是可以再次进行拆分吗,可以拆成省字段和市字段。
    其实不然,这里所说的不可拆分的意思不是字段能否从含义上再次进行拆分,而是指此字段的值是否能够
  描述此字段的含义,即江西省九江市能够描述 adress这个字段的含义。换句话说,只要是关系型数据库都

   满足1NF。
 3.2NF:在满足1NF的前提下,表中的记录是唯一的,即表中需要包含一个主键,一般来说此主键字段不应该
为业务字段。
 例:存在表 goods(goods_id,goods_no,goods_name) 此表中goods_id为主键不包含任何的 业务,不应该
    用goods_id来作为商品编号,而应该新建goods_no字段作为商品编号。
  4.3NF:在满足2NF的前提下,表中不要有冗余数据,即表中的信息如果能从与其相关联的表中获取信息,则不应该
 单独设计一个字段来存放信息。
例:存在表A(id,name,bid,bname) 表B(bid,bname) 此设计则不满足3NF的标准 即bname字段可以通过bid获取。
 (二)索引
  1、索引分类
  1.1、主键索引
       当创建一张表并将此表设置为主键时,则会创建主键索引。
   例:create table t(id int primary key auto_increment,name varchar(20 ) not null)
       此时id列就为主键索引
     或 create table t(id int,name varchar(20));
    alter table t add primary key(id);
 1.2、普通索引
 当创建表后,指定非主键列创建普通索引。
例:
 create table t(id int primary key,name varchar(20),dept_no int);
        create index t_index_id on t (dept_no);
      语法:create index 索引名 on 表名 (列名)
1.3、唯一索引
       当表的字段为unique约束时,这列就是一个唯一索引
      例:create table t(int a primary key,varchar b unique)l
       此时b字段就为唯一索引
1.4、全文索引
  主要针对对文件、文章的检索。
解释略,(全文索引对中文的支持性如何,不太确定,个人认为需要建立全文检索解决的问题,
solr几乎都能搞定, 所以就不过多做解释了)
 2.查询索引
 show index from 表名
  3.索引的原理以及优缺点
原理:未加索引前,mysql会扫描全表查询你需要的数据,
即:执行sql:select * from table where id = 5; id非索引,此时table表有100条数据,即使找到了id为5的数据
mysql任然会继续往下扫描,因为mysql无法确定只有一个id的值为5。
  加入索引后,mysql会将数据相应的地址根据不同的索引方法(如BTREE,不同的数据结构)存储到本地文件。
  当再次执行查询语句时,mysql会找到本地文件,根据索引方法获取到相应的记录的地址,然而获取数据。
优点:读取快,亲测100W+数据未加入索引前需要1.55s,加入索引后只需0.05秒。
缺点:写操作慢
  4.不会走索引的操作
  a.当创建联合索引时,即 create index t_index_name_age on table (age,name)。只有查询条件使用了
 左边的列(age),索引才会被使用,若果查询条件为右边的列(name)则索引不会被使用。
    b.使用like查询时,查询条件如果是like '%aa',则不会走索引,like'aa%'才会走索引
  c.如果条件中有or,必须要or两边的字段都为索引,才会走索引。
  d. 如果列类型为字符串,查询的值必须用引号括起来才能走索引,比如 where a = 123,则不会走索引,
   a='123'会走索引.
5.查看索引使用情况
  命令:show status like 'Handler_read%';
 其中handler_read_key 这个值越高越好,表示使用索引查到的次数.
 handler_read_md_next 这个 越高,说明查询低效
   6.mysql执行计划
   在查询语句之前加入关键命令 explain
例:
     explain各个字段的解释
     a. id:查询序列号
    b.select_type:查询类型 All表示全表扫描,表示为不走索引
  c.table:查询的表名
      d.type:扫描方式
     e.possible_key:可能用到的索引
    f.key:实际用的索引
  g.row:该sql语句可能会扫描多少行
h.Extra:额外信息 若此sql使用到了排序则会显示filesort
其他优化方案我会陆续更新博客,若本文有说错的地方,还请各位支出,不足之处也请多多包涵。

技术交流请加QQ:1026365768




  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值