mysql优化概述(范式.索引.定位慢查询)

提升网页的显示速度的方式有很多,网站访问速度慢的主要原因是操作了数据库,或者是大并发。

解决方案也是多式多样,比如,页面静态化,使用memcache或者redis,将安全性要求不高,却访问平凡的数据可以存放到内存数据库中.

但是一个网站总是要操作数据库的,所以提高sql语句的CRUD效率也是必须要做的工作.

常用的方法

   创建的表结构要满足三范式

   创建适当的索引[主键索引|唯一索引|全文索引|普通索引|空间索引|fulltext]

   优化sql语句(定位慢查询,然后优化)

   创建适当的存储过程,视图,触发器,函数

   读写分离

   优化一下my.ini文件

   硬件升级  

范式详解 

    一共有三个,第一范式,第二范式,第三范式

    第一范式:

        表的列属性,列不可以在分割,并且在表中无重复列。关系型数据库天然满足第一范式;

   关系型数据库: mysql , sql server, oracle , informix db2, postgresql

   非关系型数据: 面向对象和集合

   nosql数据库: mongodb[面向文档]

    第二范式:

        不能存在完全相同的两条记录,通常使用一个主键索引来实现,主键是非业务逻辑主键

    第三范式:

        表中不能存在冗余数据.表的列的值,如果可以通过显示推到和隐示推到出,则就不应该设置该列

    如:

        mysql优化概述(范式.索引.定位慢查询)_第1张图片

范式也不是必须遵守的,在特殊情况下,我们可能需要反三范式

如何解决,定位慢查询

     默认情况下,mysql是不会记录慢查询语句,默认情况下,慢查询的时间是10秒

show variables like 'long_query_time'

     1.以记录慢查询的方式来启动mysql

mysqld.exe  --safe-mode --log-slow-queries

    先把mysql关闭然后在重启.

 

1.      慢查询日志存放在mysqldata目录下. my.ini 配置文件有data目录

#Path to the database root

datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"

2.      为了测试,我们修改一下mysql默认的慢查询时间

set  long_query_time=1;

3.      慢查询日志的查看

mysql优化概述(范式.索引.定位慢查询)_第2张图片

4.   我们需要明确,为什么这个select .

这里给大家介绍一款工具  explain 工具,可以帮助我们分析mysql数据库在执行一个sql语句的时候,是安装什么方式执行[获得关于MySQL如何执行SELECT语句的信息].

explain sql\G

explain select * from emp where empno=347677\G

mysql优化概述(范式.索引.定位慢查询)_第3张图片

1.      通过刚才的分析,我们初步判断是没有创建索引造成.

empno 这个字段上创建主键索引

alter  table 表名  add  primary key(列名,列名...)

alter  table  emp  add  primary key (empno);

创建完索引后,我们发现索引文件变大了,这说明索引有开销,要占用磁盘空间.

索引原理

使用索引的代价占用更多多的磁盘空间

dmlupdate ,insert , delete )速度有影响

1.      目前的索引类型

l      hash的索引

l     bintree 二叉树

创建索引的注意事项

mysql优化概述(范式.索引.定位慢查询)_第4张图片

索引原理

主键索引创建有两种情况,

1. 在创建表的时候,直接指定主键索引

2. 创建表后,在增加主键索引.

1        create table aaa( id int primary key auto_increment, name varchar(32));

2        create table bbb(id int , name varchar(32));

alter table bbb add primary key(id);

    主键索引的特点1. 一个表中最多只有一个主键索引

                 2. 一个主键索引可以指向多列

                 3. 主键索引的列,不能有重复的值,也不能有null

                 4. 主键索引的效率高

唯一索引的创建有两种情况:

1. 在创建表时,直接指定唯一索引,

2. 把表创建完后,在指定唯一索引.

1.      create table ddd( id int primary key auto_increment, name varchar(32) not null default '', email varchar(64) unique);
2.      create table eee( id int primary key auto_increment, name varchar(32) not null default '', email varchar(64));

添加索引方法有两种

a.        create unique index 索引名字 on 表名 (列名..)

 create unique index  uni_email  on  eee(email);

b.       alter  table 表名  add  unique [索引名] (列名..)

alter  table eee  add  unique  (email );

     唯一索引的特点: 1. 一个表中可以有多个唯一索引

                    2. 一个唯一索引可以指向多列 

                    3. 如果你在唯一索引上,没有指定not null ,则该列可以为空,同时可以有多个null

            4.     唯一索引的效率较高

    普通索引创建:

    一般来说,是表创建完了之后在来创建普通索引

create table fff(id int primary key auto_increment, name varchar(32) not null default '',email varchar(64) not null default '');

添加普通索引方法两个

1.  create index 索引名 on 表名 (列名。。)

   create index inx_email on fff(email);

2.  alter table 表名 add  index [索引名] (列名..)


    全文索引的创建

mysql自带的全文索引mysql5.5不支持中文, 支持英文,同时要求表的存储引擎是myisam。如果希望支持中文,有两个方案 1. 使用sphinx中文版 coreseek 2. 插件mysqlcft.

创建一张表,使用全文索引

CREATE TABLE articles (
       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       title VARCHAR(200),
       body TEXT,
       FULLTEXT (title,body)
     )engine=myisam charset utf8;
    如何使用全文索引

        select * from articles where body like '%database%';  [这样没有使用到索引]
        百分号不能加前面
,可以在中间,也可以在最后



SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database')[ok]
全文索引有两个概念[匹配度,停止词]
匹配度: 在使用全文索引去检索数据,匹配到的概率是多大.

mysql优化概述(范式.索引.定位慢查询)_第5张图片

特别注意的是:

停止词: 全文索引对非常普通的词,不会创建索引.

索引的查询

        show index from table;

        show indexes from table;

        show keys from table;

        desc table;


索引的修改

        删掉索引,然后重新创建

索引的删除

drop  index索引名  on 表名;

alter table 表名 drop index 索引名 ;

主键删除

alter table 表名 drop primary key;

如果你在删除主键索引时,该主键是自增的,则需要先去掉自增属性,然后在干掉.

create table ttt( id int unsigned primary key auto_increment , name varchar(32) not null default '');

先去掉auto_increment;

alter table 表名 modify 列定义;

(1)alter  table ttt  modify id int unsigned;

(2) alter  table  ttt drop primary key;

        
























你可能感兴趣的:(mysql优化概述(范式.索引.定位慢查询))