Mysql数据库的优化技术(1)

对mysql优化时一个综合性的技术,主要包括

a: 表的设计合理化(符合3NF(3范式))

b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]

c: 分表技术(水平分割、垂直分割)

d: 读写[写:update/delete/add]分离

e: 存储过程 [模块化编程,可以提高速度]

f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]

g: mysql服务器硬件升级

h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM) 

1.什么叫3范式?

1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sqlserver),就自动的满足1NF;

2NF: 表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现;

3NF: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. 

show status like ‘uptime’ ; #mysql运用多久时间

show  stauts like ‘com_select’;#数据库查询语句用了多少次

show status like 'com_insert';#数据库增加语句用了多少次

show status like 'com_update';#数据库更新语句用了多少次

show status like 'com_delete';#数据库删除语句用了多少次

 show[session|global] status like .... 如果你不写  [session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该 global)

show status like ‘connections’; #有多少设备连接数据库

show status like ‘slow_queries’;#慢查询有多少

show variables like ‘long_query_time’ ; //可以显示当前慢查询时间

set long_query_time=1 ;//可以修改慢查询时间。单位:秒


①    这时我们如果出现一条语句执行时间超过1秒中,就会统计到.

②    如果把慢查询的sql记录到我们的一个日志中

在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以

需要在电脑管理里将mysql关闭,然后运用一下在进入cmd里进入mysql安装目录执行以下命令,还需要从新设置慢查询时间

bin\mysqld.exe - -safe-mode  - -slow-query-log [mysql5.5 可以在my.ini指定]

bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

如果启用了慢查询日志,默认把这个文件放在

my.ini 文件中记录的位置(我的是默认的,尽量不要改, 不然索引可能需要重新建

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

四种索引(主键索引/唯一索引/全文索引/普通索引)

1.      添加

 

1.1主键索引添加

当一张表,把某个列设为主键的时候,则该列就是主键索引

create table aaa

(id int unsigned primary key auto_increment,

name varchar(32) not null defaul ‘’);

这是id 列就是主键索引.

如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:

alter table 表名 add primary key (列名);

举例:

create table bbb (id int , name varchar(32)not null default ‘’);

alter table bbb add primary key (id);


1.2普通索引

一般来说,普通索引的创建,是先创建表,然后在创建普通索引

比如:

create table ccc(

id int unsigned,

name varchar(32)

)

create index 索引名 on 表 (列1,列名2);


1.3创建全文索引

全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用.

创建 :

CREATE TABLE articles (

      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

      title VARCHAR(200),

      body TEXT,

      FULLTEXT (title,body)

    )engine=myisam charset utf8;

INSERT INTO articles (title,body) VALUES

    ('MySQL Tutorial','DBMS stands for DataBase ...'),

    ('How To Use MySQL Well','After you went through a ...'),

    ('Optimizing MySQL','In this tutorial we will show ...'),

    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),

    ('MySQL vs. YourSQL','In the following database comparison ...'),

    ('MySQL Security','When configured properly, MySQL ...');

如何使用全文索引:

错误用法:

select * from articles where body like ‘%mysql%’;【不会使用到全文索引】

证明:

explain select * from articles where body like ‘%mysql%’;

正确的用法是:

select * from articles wherematch(title,body) against(‘database’); 【可以】

 说明:

1.      在mysql中fulltext 索引只针对 myisam生效

2.       mysql自己提供的fulltext针对英文生效->sphinx(coreseek) 技术处理中文

3.      使用方法是 match(字段名..) against(‘关键字’)

4.      全文索引一个 叫 停止词,  因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.


1.4唯一索引

①当表的某列被指定为unique约束时,这列就是一个唯一索引

create table ddd(id int primary keyauto_increment , name varchar(32) unique);

这时, name 列就是一个唯一索引.

unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复.

主键字段,不能为NULL,也不能重复.

②在创建表后,再去创建唯一索引

create table eee(id int primary keyauto_increment, name varchar(32));

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


1.  查询索引

desc 表名【该方法的缺点是: 不能够显示索引名.】

show index(es) from 表名

show keys from 表名



2.  删除索引
drop index 索引名 on 表名
drop index dex on role

u  索引使用的注意事项

索引的代价:

1.      占用磁盘空间

2.      对(增,删,改)操作有影响,变慢

@ 在哪些列上适合添加索引?

1.较频繁的作为查询条件字段创建索引

    select    *   from   user   where  u_name='aa';

2.唯一的几个值的字段不适合单独创建索引,即使频繁作为查询条件

    select    *   from   user   where  u_sex='男';

3.更新频繁的字段不适合创建索引

    select    *   from   user   where  u_update_time='2014-05-05';

4.不会出现在where子句中,字段不该创建索引

使用索引的注意事项

说明,如果我们的表中有复合索引(索引作用在多列上), 此时我们注意:

1.   对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。

alter table dept add index my_ind(dname,loc); //  dname 左边的列,loc就是右边的列。

select   *   from  dept   where   loc='aaa';//这个就不会使用索引,一定要将dname字段放入才行

2.  对于使用like的查询,查询如果是  ‘%aaa’不会使用到索引, ‘aaa%’会使用到索引。

3.  如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or关键字

4.  如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’), 也就是,如果列是字符串类型,就一定要用 ‘’ 把他包括起来.

5.  如果mysql估计使用全表扫描要比使用索引快,则不使用索引。


u  如何查看索引使用的情况:

show status like‘Handler_read%’;

 

大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值