oop:面向对象思想 (mvc模式) 自定义一套框架(mvc + mysql())
mysql(高级理论) mysql优化
设计数据库(表的结构设计开始)
一:数据库三大范式
mysql优化
1NF----2NF-----3NF 三大范式
(1):第一范式(1NF 列不可在分 (表里面的数据增加,不要影响原有的数据结构) )
id 部门主管 员工 员工1 员工2 员工3 员工4
1 A a b c u j2 B 1 2 3 C q w e r4 D t id 部门主管 员工 1 A a2 A b3 A c4 A u5 A j6 B 1 (2):第二范式(2NF 行不可再分 (降低数据冗余,数据冗余和查询效率成正比)) 数据冗余永远降不到0外键:主表主表里面有个字段是附表里面的id字段那么主表里面的这个字段叫外键 id 姓名 年龄 联系电话 地区邮编 1 张三 22 127.。。 12 张四 22 127.。。 13 可爱 18 135.。。 24 王五 23 134。。。 15 李四 34 124.。。。 3//附表 //地区表id 地区 邮编1 西安 71400002 四川 11000003 北京 1221343 (3) :第三范式(3NF 表不可再分 (不必要的数据就不要在数据库里面在去存储 ))id 单价 库存 销量 销量总额
1 10 2 4 402 20 4 5 1003 6 8 7 424 8 6 8 64id 单价 库存 销量 1 10 2 4 2 20 4 5 3 6 8 7 4 8 6 8//这张表有问题
id 姓名 性别 民族 身份证号码1 可爱 1 1 12345678902 乖巧 2 1 12312435453 张三 2 2 12324324324 李四 1 1 1232432432 //名族表id 民族 住址
1 汉族 四川 2 布依族 西安 //性别表id 性别1 男2 女id 姓名 成绩 科目 学期
1 张三 80 1 12 张三1 80 2 23 张三2 80 1 14 张三3 80 1 1 //科目表id 科目
1 物理2 化学//学期表
id 学期
1 第一学期2 第二学期
二 :设计表的结构要注意 (节约空间)
(1):99.9%的情况下,全部为NOT NULL类型 id is null(不为空) (2) :预计不会存储非负数的字段,例如各项id、发帖数等,必须设置为UNSIGNED类型 (3) :enum() 枚举类型 (通常枚举类型用在性别) ☆tinyint(数据类型一般用在年龄字段)
UNSIGNED :有符号(或者无符号)(4) : 日期使用int类型保存时间戳,通常用unsigned(或者用字符串类型 ) 整形最节约成本
三:设计表的数据类型
(1):整形类型
字段类型 存储空间(b) UNSIGNED 取值范围tinyint 1 否 / 是 -128~127 / 0~255smallint 2 否 / 是 -32768~32767 / 0~65535
mediumint 3 否 / 是 -8388608~8388607 / 0~16777215
int 4 否 / 是 -2147483648~2147483647 / 0~4294967295
bigint 8 否 / 是 -9223372036854775808~9223372036854775807 / 0~18446744073709551615
(2):字符串类型注意:一个汉字占多少长度与编码有关UTF-8:一个汉字=3个字节GBK :一个汉字=2个字节字段类型 取值范围
char(n) ☆ 0-255字节varchar(n) ☆ 0-65535 字节
tinytext 0-255字节,最多255个字符
text 0-65535字节,最多65535个字符
mediumtext 0-16 777 215字节,最多2的24次方-1个字符
longtext 0-4 294 967 295字节,最多2的32次方-1个字符
(3):日期类型字段类型 取值范围
TIME ☆ 3 HH:MM:SS 时间值或持续时间
四 :
(1):变长表 (一张表里面数据类型有char varchar text,同时有char varchar只要有varchar就是变长表)
id(int) name(varchar[10]) sex(枚举)
1 jack 男2 rose 女3 lolita 女name(varchar[10])
[jack][rose][lolita](2):定长表 (一张表里面出现 char int 这张表称为定长表)id(int) name(char[10]) sex(枚举)
1 tim 男2 lucy 女3 lily 女name(char[10])[tim ][lucy ][lily ] 1.存储方式:定长表char[10] 内容不够你定义的长度会自动给你添满整个长度 定长表自动添加,但查询效率高,适合频繁查询的 变长表varchar[10]内容不够你定义的长度,他不会去给你填充长度 变长表varchar[10]比定长表char[10]节约空间. 变长表不自动填充,节约空间,安全且查询不那么频繁的2.读取方式:定长表char[10]比变长表varchar[10]查询效率高3.一般频繁查询的表设计为定长表char[10],
一般安全高且查询不是那么频繁用变长表varchar[10]
五:设计表的数据引擎1.MyISAM ☆:(数据库默认引擎)非事务表,支持全文搜索fulltext,搜索速度快,记录表行数,但写入速度慢,不支持外键。多用于频繁查询,数据量要求不高的数据表中.事务:(回滚) 2.nnoDB ☆:事务表,支持外键等高级数据库功能,CPU利用率最高,不支持全文搜索,搜索速度相对较慢,不记录行数。多用于安全性要求高,数据量高的数据表中. 3.Memory:内存表,数据记录在内存中,写入及查询速度最快。但由于使用内存,根本无法长期保存数据,而且可以保存的数据量也不能太高。通常用于临时记录数据,可以即用即弃的数据表中,如密钥验证记录密钥等 六.视图(作用:提高查询效率,提高数据安全)
(1):创建一个视图 VIEW:视图
视图创建:CREATE ALGORITHM=视图类型 VIEW 视图名 as 查询sql语句(要什么样的视图写什么语句)CREATE VIEW 视图名 as 查询sql语句(要什么样的视图写什么语句)
CREATE VIEW 视图名 as 曾 删 改 查(2):视图创建特点(注意的内容)
视图涉及到相关字段名,不能有重复视图名字不能与任何表名重复视图不能重复取一个名字创建多个视图创建视图的sql查询语句,语法与普通查询一样视图查询与普通sql查询一致,如视图名为news_view,查询语句: select * from news_view (3):视图的作用安全性:隐藏真实的数据表,防止数据表泄漏。开发速度提升:例如多表查询,以往要写复杂的语句,现在多个表关联到一个视图,只查询一个视图,语 句变得简单查询速度提升:以往多表查询,需从硬盘中获取多次,而视图只获取一次 七:存储过程(提高查询效率)(1):创建一个存储过程
CREATE PROCEDURE 过程名 ([过程参数[,...]]) BEGIN 过程体 END CREATE PROCEDURE 过程名(iid INT)BEGIN删除语句 delete from news where id=iidend//创建一个存储过程
CREATE PROCEDURE news_cc (iid INT)BEGINDELETE from news where id=iid;end 2.执行存储过程:CALL 过程名 ([过程参数[,...]]) CALL 过程名(2);CALL news_cc (19);
3.删除存储过程:drop PROCEDURE 过程名八:触发器(trigger)(提高查询效率,弊端:数据维护很难)
有回滚性
九:索引:索引的作用相当于一本书的目录,索引能大大加快查询速度。索引优化和查询优化是相辅相成的。
(1):PRIMARY(pk):主键,在所有类型的索引速度最快。每个数据表最多有一个,涉及到主键的字段(组合)值必须唯一。建议每个数据表都建立一个主键,该主键就是id。
(2):UNIQUE:唯一索引,速度仅次于主键,涉及到的字段(组合)值必须唯一。但一个数据表中可以存在多个。
(3):INDEX(了解):普通索引,速度在三者中最慢,但是几乎没有任何限制
(4) : fulltext:全文索引,主要用于模糊搜索。表类型必须是myisam,涉及字段类型必须是字符型
(5): spaital(了解):地理信息索引,主要用于地理信息搜索。涉及字段类型必须是地理信息型
十:group by :分组(统计分组数据 )order by :排序 (asc(默认的升序) desc:降序)
select sex,count(*) from stus group by sex
//一般用在多表查询时使用 多表查询联系关键字 left join(左链接) right join(右链接) inner join(内连接) (用的比较多) ☆select * from news inner join category on category.id=news.category_id
news表 (文章信息表)
id title content time category_id1 哈哈哈 嘻嘻 11-5 3 1 哈哈哈1 嘻嘻1 11-5 41 哈哈哈2 嘻嘻2 11-5 51 哈哈哈3 嘻嘻3 11-5 31 哈哈哈4 嘻嘻4 11-5 31 哈哈哈5 嘻嘻5 11-5 3category :(分类表)id name pid
1 娱乐 0
2 体育 0
3 ktv 14 足球 25 西甲 4
十一: explain :分析查询语句的效率explain 查询语句
explain select * from news where id=1SIMPLE:最简单的sql语句,最常见。大部分有效率的语句,类型都是SIMPLEPRIMARY:查询的数据表是一个动态表,数据表是有一条sql语句生成的结果集构建出的临时表,该表无法 使用索引,如下
select * from (select * from news)n,通过n得到结果集来查询,那n就是动态表UNION:使用union关键字,用于合并两个或多个 SELECT 语句的结果集(一般少用)
十二:用命令操作mysql数据库cmd:打开命名控制面板
cd D:\phpstydy\phpStudy\MySQL\bin 进入到这个文件d: 进入到d盘文件
mysql -u root -p 链接数据库 登录MySQLmysql -u root -p切换选择数据库use dbname;显示所有数据库show databases;显示数据库中所有数据表show tables;查看数据表结构describe table;显示表创建信息show create table table_name;查看运行环境信息status;