提升网页的显示速度的方式有很多,网站访问速度慢的主要原因是操作了数据库,或者是大并发。
解决方案也是多式多样,比如,页面静态化,使用memcache或者redis,将安全性要求不高,却访问平凡的数据可以存放到内存数据库中.
但是一个网站总是要操作数据库的,所以提高sql语句的CRUD效率也是必须要做的工作.
一共有三个,第一范式,第二范式,第三范式
第一范式:
表的列属性,列不可以在分割,并且在表中无重复列。关系型数据库天然满足第一范式;
关系型数据库: mysql , sql server, oracle , informix , db2, postgresql
非关系型数据: 面向对象和集合
nosql数据库: mongodb[面向文档]
第二范式:
不能存在完全相同的两条记录,通常使用一个主键索引来实现,主键是非业务逻辑主键
第三范式:
表中不能存在冗余数据.表的列的值,如果可以通过显示推到和隐示推到出,则就不应该设置该列
如:
范式也不是必须遵守的,在特殊情况下,我们可能需要反三范式
默认情况下,mysql是不会记录慢查询语句,默认情况下,慢查询的时间是10秒
show variables like 'long_query_time'
1.以记录慢查询的方式来启动mysql
mysqld.exe --safe-mode --log-slow-queries
先把mysql关闭然后在重启.
1. 慢查询日志存放在mysql的data目录下. 在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. 慢查询日志的查看
4. 我们需要明确,为什么这个select 慢.
这里给大家介绍一款工具 explain 工具,可以帮助我们分析mysql数据库在执行一个sql语句的时候,是安装什么方式执行[获得关于MySQL如何执行SELECT语句的信息].
explain sql\G
explain select * from emp where empno=347677\G
1. 通过刚才的分析,我们初步判断是没有创建索引造成.
在empno 这个字段上创建主键索引
alter table 表名 add primary key(列名,列名...)
alter table emp add primary key (empno);
创建完索引后,我们发现索引文件变大了,这说明索引有开销,要占用磁盘空间.
使用索引的代价占用更多多的磁盘空间
对dml(update ,insert , delete )速度有影响
1. 目前的索引类型
l hash的索引
l bintree 二叉树
创建索引的注意事项
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 MATCH (title,body) AGAINST ('database')[ok]
全文索引有两个概念[匹配度,停止词]
匹配度: 在使用全文索引去检索数据,匹配到的概率是多大.
特别注意的是:
停止词: 全文索引对非常普通的词,不会创建索引.
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;