php的访问流程
浏览器 =>web服务器=>后端脚本(php)=>数据库(mysql)php
网站优化的的几点
一.①提升并发量 负载均衡(分布式服务器架构) 并发量更高的软件(nginx)
一.② 页面静态化 不常常发生数据变更的动态网页生成静态网页,提升访问速度
一.③内存缓存优化 把数据缓存到内存中,提升数据响应速度
一.④数据库优化
通常数据读写频繁,能够缓存到内存中。可是内存容量有限,不可以把大量数据缓存,全部优化数据库软件自己是颇有必要的。mysql
现实中④数据库优化更实际(多)
那么咱们如何实际优化数据库mysq呢
①存储层 存储引擎 列类型选择 范式(三范式)
② 设计层 索引 缓存 分区表
③ sql层 使用执行效率高的sql语句,explain执行计划,慢查询日志记录
④架构层 分布式数据库架构 使用多台数据库服务器,解决数据库访问并发的问题,
主从复制 从服务器复制主服务器数据
存储引擎 myisam和innodb这两种最经常使用nginx
myisam和innodb的区别
①myisam的结构数据,索引的的物理文件
.frm 结构文件 .MYD数据文件 .MYI索引文件
② 数据存储顺序 当插入当存储引擎为myisam的存储引擎 存储顺序是插入顺序 ,没有进行排序操做
③ 功能 复制备份 压缩机制
myisam数据表生成文件有三个,若是进行数据备份,直接复制粘贴三个文件便可。myisam数据压缩 压缩机制:数据表进行压缩,节省存储空间,提升查询速度
语法
myisampack tablename路径 压缩
myisamchk –unpack tablename路径 解压
myisamchk -rq tablename路径 从新生成索引
④并发性 表级锁 (并发写入)
myisam 表级锁,锁表会影响整个表的操做,并发性稍微逊色
innodb 存储引擎
innodb全部的数据和索引文件在一个文件里,能够在建立表时候进行分离
临时设置分离
先查看 mysql> show variables like ‘innodb_file_per_table’;
开启 mysql> set global innodb_file_per_table =1;
开启后,分为结构文件 和 数据索引文件
数据主键顺序存储
innodb支持事务 外键 myisam不支持事务和外键
事务:保证数据的一致性,原子性
外键:一种约束,规则
innodb并发性:擅长并发web
那么现实中如何选择数据库中这两种经常使用的存储引擎呢?
①通常使用 普通读写较多的,备份恢复方便,压缩机制 选用myisam
好比 cms(内容管理系统,快速搭建网站) 好比二次开发的dedecms建站系统
②并发写入 (行锁) 事务 外键 innodb
好比:订单系统sql
#
固然mysql并不仅有这两种存储引擎
好比其它的存储引擎
①memory 数据至于内存的存储引擎,拥有极高的插入,更新和查询效率,可是会占用和数据量成正比的内存空间,而且其内容在mysql从新启动时会丢失,不支持text类型数据库
列类型选择
整型 int
字符串 文本类型 char varchar text
选用 好比 人类年龄 选用 tinyint
内容长度固定字段
char 定长255字符
varchar 变长 65535字节
如何数据不定长,使用varchar会更节省空间,若是追求查询效率,就须要使用char
整型:尽可能使用可以整型存储数据
时间戳使用
使用int类型存储,节省空间,时间范围更好计算肯定
mysql中时间戳相关函数
unix_timestamp() 当前时间戳的信息
from_unixtime() 读取一个时间戳信息
ip存储使用
mysql函数 :inet_atom inet_ntoa()
php函数 ip2long() long2ip()后端
范式是一种规范或者约束。设计数据库表是符合规范的,就被认为是良好的数据表设计
三范式
第一范式 数据字段具备原子性,业务上不可再分割。
第二范式 数据具备惟一性(主键id)。
第三范式 数据字段和主键具备紧密联系,不容许出现冗余(rong[重复])字段
三范式 :一环一环知足
1NF<2NF<3NF
逆反式
真实业务的环境,为了可以实现更好的数据库表的性能,会选择不遵照范式的操做。
遵照第三范式,查询数据,须要连表操做,若是数据表数据不少,连表操做,会耗费大量时间。为了提升查询效率。能够选择把数据字段存储到同一个表中。浏览器
创建了冗余字段以后,必定要注意维护数据的一致性。缓存
索引 生活中实际索引举栗子 —》—-》书的目录 指引 公交站牌 办公室指引牌
索引是一种数据结构(存储数据的方式),存储字段值的内容和对应真实数据的物理地址。
查询数据经过索引查询到物理地址,再经过物理地址直接定位数据。
索引是一种以空间换取时间的方式,牺牲了写的速度,提升查询速度。
alter table tablename add primary key(字段);
索引为何这么快?
创建索引以后,查询变为:
查询字段=>索引=>物理地址=>真实数据‘
’索引的类型:
mysql中使用关键字 key index 标识索引
主键索引 primary key 主键约束 惟一性 不能为null
惟一索引 unique key 惟一约束 惟一性 能够为null
普通索引 key
全文索引 fulltext key 只支持文本类型(char varchar text),文本中的内容进行分词,分别创建索引 mysql5.6如下是innodb不支持
建立索引的方式:
①创建表结构设计索引
create table 表名(
字段~~~~~
primary key (id),
unique index 名字,
index 名字(字段),
index 名字(字段,字段), –复合索引
fulltext index 名字(字段);
)
②使用修改结构语法的语句(alter table)
alter table 表名
add primary key (id),
add unique key名字(字段),
add key|index 名字(字段),
add key 名字(字段,字段), –复合索引
add fulltext key 名字(字段);
若是不指定索引名称,会默认选择字段名称,是复合索引的话,选择第一个字段做为索引名称。若是索引名称有重复冲突,会自动顺延编号。服务器
alter table 表名称 drop 索引类型 key 索引名称
删除主键索引
先更改主键的索引,而后再删除
alter table student modify id int unsigned not null comment ‘id属性’;
alter table student drop primay key;
删除非主键索引使用key关键字,后面跟索引名称
alter table student drop key introduce;
六、执行计划explain
创建索引是为了可以提升查询效率。检查索引是否使用到。
explain执行计划,不会真实执行,分析sql语句执行的过程和使用的资源。
别名语法desc
语法:desc|explain 执行的sql语句 \G;
mysql> explain select * from emp where empno =10010\G;
索引使用场合
①where条件字段
explain select * from emp where empno=’10006’\G;
②order by 排序字段
desc select * from emp order by empno limit 5\G;
索引原则 创建的索引字段,可能没有使用到索引。缘由是没有遵照索引的使用原则。 ①列独立 字段类型不可以进行运算操做。 若是列类型不独立,就不可以使用到索引 ②左固定 模糊查询 like 左固定 like “1000%”; 给ename创建一个普通索引 ③复合索引 须要同时出如今条件中,才可使用到复合索引,单独使用不到 ④or条件 or条件字段若是都有索引可用,则索引均可用;若是有其中一个字段索引不可用,则都不可用。