一难述、數(shù)據(jù)庫概述
1.為什么軟件測試工程師還需要學(xué)習(xí)數(shù)據(jù)庫以及開發(fā)方面的知識?
- 測試工程師的目的是找出軟件的不足胀茵,并告訴開發(fā)工程師社露,出現(xiàn)問題的環(huán)境,操作步驟和輸入輸出數(shù)據(jù)琼娘;優(yōu)秀的測試工程師峭弟,需要告訴開發(fā)團(tuán)隊,軟件的不足脱拼,這類不足會導(dǎo)致什么情況瞒瘸,如何避免,以及如何去修改(這是為什么高級軟件測試工程師比開發(fā)工程師工資高的原因)熄浓。
- 測試工程師在測試軟件過程中情臭,不僅僅需要在界面進(jìn)行操作,還需要檢查數(shù)據(jù)庫中的數(shù)據(jù)是否正確赌蔑,從而在軟件出現(xiàn)問題時候俯在,能夠定位到問題原因;
- 學(xué)習(xí)數(shù)據(jù)庫娃惯,掌握數(shù)據(jù)庫操作跷乐,增加面試成功機(jī)會,可以提高工資趾浅。
2. 什么是數(shù)據(jù)庫
- Excle的數(shù)據(jù)的確很方便愕提,但是對于企業(yè)來說就不一樣了馒稍。一個公司里面可能有成千上萬的Excel表格,還在不同的電腦上浅侨,而他們的員工和客戶需要實時看到企業(yè)給他們提供的所有數(shù)據(jù)纽谒,這種文件管理的方法就很麻煩,總不能每分鐘都把一個新的巨大無比的Excel文件發(fā)給所有客戶呀如输。
- 數(shù)據(jù)庫是按照數(shù)據(jù)的結(jié)構(gòu)來組織鼓黔、存儲、和管理數(shù)據(jù)的倉庫挨决,簡而言之请祖,就是存放數(shù)據(jù)的倉庫订歪。正是因為有了數(shù)據(jù)庫后脖祈,所有人可以直接在這個系統(tǒng)上查找數(shù)據(jù)和修改數(shù)據(jù)。例如你每天使用余額寶查看自己的賬戶收益刷晋,就是從后臺數(shù)據(jù)庫讀取數(shù)據(jù)后給你的盖高。
- 數(shù)據(jù)庫的英文名稱叫DB(Database),那么數(shù)據(jù)庫里面有什么東東呢眼虱?
其實喻奥,數(shù)據(jù)庫通常包含一個或多個表組成。如果你用過Excel捏悬,就會知道Excel是一張一張的二維表撞蚕。每個表都是由列和行組成的,其中每一列都用名字來標(biāo)識出來过牙。同樣的甥厦,數(shù)據(jù)庫里存放的也是一張一張的表,只不過各個表之間是有聯(lián)系的寇钉。所以刀疙,簡單來說:數(shù)據(jù)庫=多張表+各表之間的關(guān)系
其實數(shù)據(jù)庫是邏輯上的概念,它是一堆互相關(guān)聯(lián)的數(shù)據(jù)扫倡,放在物理實體上谦秧,是一堆寫在磁盤上的文件,文件中有數(shù)據(jù)撵溃。這些最基礎(chǔ)的數(shù)據(jù)組成了表(table)疚鲤。
3. 常見數(shù)據(jù)庫
Oracle是最掙錢的數(shù)據(jù)庫,出自甲骨文公司缘挑,市場占有率非常高集歇,功能非常強(qiáng)大,被一些大型企業(yè)卖哎,電信鬼悠,銀行删性,證券公司、金融公司所使用焕窝,市場占有率第一蹬挺。
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā)它掂,目前屬于 Oracle 旗下產(chǎn)品巴帮。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面虐秋,MySQL是最好的 RDBMS (Relational Database Management System榕茧,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件。MySQL目前最流行的開源數(shù)據(jù)庫客给,被甲骨文公司所占用用押,威脅著老大Oracle的地位,開源靶剑,免費蜻拨,支持多平臺,簡單易學(xué)易操作桩引,市場占有率第二缎讼。
SQLServer是微軟開發(fā)的數(shù)據(jù)庫,針對服務(wù)器坑匠,僅支持Windows操作系統(tǒng)血崭,號稱是windows上最好用的數(shù)據(jù)庫。數(shù)據(jù)庫的天下不僅僅是MySQL和Oracle的厘灼,SQLServer也正在慢慢崛起夹纫,微軟網(wǎng)羅了不少數(shù)據(jù)庫的專家,推出了不少重磅功能手幢。
MongoDB捷凄,最好用的文檔型數(shù)據(jù)庫,是NOSQL類型數(shù)據(jù)庫的領(lǐng)導(dǎo)者之一围来,也是當(dāng)前最成功的NoSQL類型數(shù)據(jù)庫跺涤,數(shù)據(jù)存儲格式采用JSON形式,非常靈活监透。
Redis桶错,最好的內(nèi)存級數(shù)據(jù)庫,查詢效率極高胀蛮,并且在Redis 3.0之后院刁,支持多種數(shù)據(jù)類型,String粪狼,Set退腥,List任岸,Hash等類型,開始支持集群狡刘,彌補了自身短板享潜。是目前做緩存最流行的數(shù)據(jù)庫
Neo4J,最好的圖形化數(shù)據(jù)庫嗅蔬,流行話較低剑按,但是圖形化數(shù)據(jù)庫的絕對領(lǐng)導(dǎo)者。
SQLite澜术,最流行的嵌入式數(shù)據(jù)庫艺蝴,占領(lǐng)手機(jī)行業(yè)的絕對領(lǐng)導(dǎo)者地位,Android和IOS兩大手機(jī)系統(tǒng)鸟废,都內(nèi)嵌了SQLite數(shù)據(jù)庫猜敢,SQLite是一個完整的關(guān)系型數(shù)據(jù)庫,支持標(biāo)準(zhǔn)SQL侮攀,支持事務(wù)操作锣枝,程序包非常小厢拭,是嵌入式設(shè)備的最佳選擇兰英。
各個數(shù)據(jù)庫軟件的使用差別大同小異,但是因為MySQL是開源的供鸠,成為各大公司使用的主流畦贸,面試也主要以MySQL為主。
4.數(shù)據(jù)庫和SQL是什么關(guān)系楞捂?
結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL薄坏,是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計語言寨闹,用于存取數(shù)據(jù)以及查詢胶坠、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng);同時也是數(shù)據(jù)庫腳本文件的擴(kuò)展名质礼。
數(shù)據(jù)庫里面放著數(shù)據(jù)师脂,而SQL是用來操作數(shù)據(jù)庫里數(shù)據(jù)的語言(工具)澳腹。
例如有一碗米飯(碗就是mysql,里面放的米是數(shù)據(jù))闻牡,你要吃碗里的米飯,拿什么吃绳矩?拿筷子(sql)罩润。用筷子(sql)操作碗里(mysql)的米飯(數(shù)據(jù))
二、MySQL數(shù)據(jù)庫的安裝配置
三翼馆、SQL語句分類
3.1. DDL-數(shù)據(jù)庫定義語言
3.1.1. 概念及作用
database defination language 數(shù)據(jù)庫定義語言割以,用于定義數(shù)據(jù)庫金度,用于定義表結(jié)構(gòu)
3.1.2. 表中字段基本數(shù)據(jù)類型
MySQL支持多種類型,大致可以分為三類:數(shù)值严沥、日期/時間和字符串(字符)類型
- 一個漢字占多少長度與編碼有關(guān):
UTF-8:一個漢字=3個字節(jié)
GBK:一個漢字=2個字節(jié) - varchar(n) 表示 n 個字符审姓,無論漢字和英文,Mysql 都能存入 n 個字符祝峻,僅是實際字節(jié)長度有所區(qū)別
3.1.3. 數(shù)據(jù)庫語句操作
- 在登陸 MySQL 服務(wù)后魔吐,使用 create 命令創(chuàng)建數(shù)據(jù)庫,語法如下:
CREATE DATABASE 數(shù)據(jù)庫名;//創(chuàng)建第一個數(shù)據(jù)庫 mydb1 create database mydb1
- 在刪除數(shù)據(jù)庫過程中莱找,務(wù)必要十分謹(jǐn)慎酬姆,因為在執(zhí)行刪除命令后,所有數(shù)據(jù)將會消失奥溺。語法:
//刪除創(chuàng)建的數(shù)據(jù)庫 drop database mydb1;
- 在你連接到 MySQL 數(shù)據(jù)庫后辞色,可能有多個可以操作的數(shù)據(jù)庫,所以你需要選擇你要操作的數(shù)據(jù)庫
//選擇數(shù)據(jù)庫 user mydb1
注意:所有的數(shù)據(jù)庫名浮定,表名相满,表字段都是區(qū)分大小寫的。所以你在使用SQL命令時需要輸入正確的名稱桦卒。
- 查看數(shù)據(jù)庫創(chuàng)建細(xì)節(jié)
show create database mydb1
- 創(chuàng)建一個使用gbk字符集的數(shù)據(jù)庫
create database mydb2 character set gbk
3.1.4. 表結(jié)構(gòu)語句操作
- 選擇數(shù)據(jù)庫
use mydb1
- 創(chuàng)建MySQL數(shù)據(jù)表需要以下信息:
表名立美、表字段名、定義每個表字段//創(chuàng)建表 create table student(id int,name varchar(20),sex varchar(20),age int,salery float(6,2),birthday date) //刪除表 drop table student; //查看所有表 show tables //查看表的創(chuàng)建細(xì)節(jié) show create table student; //展示表結(jié)構(gòu) desc student // 在原有的學(xué)生基礎(chǔ)上添加address列 alter table student add address varchar(20) //在原有的學(xué)生基礎(chǔ)上刪除address列 alter table student drop address
3.1.5. 定義表的約束
create table student(id int primary key auto_increment,name varchar(20) unique not null,sex varchar(20),age int,salery float(6,2),birthday date)
- 如果你不想字段為 NULL 可以設(shè)置字段的屬性為 NOT NULL方灾, 在操作數(shù)據(jù)庫時如果輸入該字段的數(shù)據(jù)為NULL 建蹄,就會報錯。
- AUTO_INCREMENT定義列為自增的屬性裕偿,一般用于主鍵洞慎,數(shù)值會自動加1。
- PRIMARY KEY關(guān)鍵字用于定義列為主鍵嘿棘。為了標(biāo)識數(shù)據(jù)庫記錄唯一性劲腿,不允許記錄重復(fù),且鍵值不能為空鸟妙,主鍵也是一個特殊索引焦人。 您可以使用多列來定義主鍵,列間以逗號分隔圆仔。
- UNIQUE KEY的用途:主要是用來防止數(shù)據(jù)插入的時候重復(fù)的
- ENGINE:設(shè)置存儲引擎
- CHARSET: 設(shè)置編碼
3.2 DML - 數(shù)據(jù)庫操作語言
3.2.1. 概念及作用
DML:data manipulation language 數(shù)據(jù)庫操作語言垃瞧,用以操作數(shù)據(jù)庫。
3.2.2. 插入數(shù)據(jù)
//插入數(shù)據(jù)
insert into student values(1,’zhangsan’,’nan’,19,389.10,’1999-10-10’);
//查詢
select * from student
- 問題一:插入中文會報錯
insert into student values(2,’李四’,’男’,19,389.10,’1999-10-10’);
- 解決:
//通知服務(wù)器客戶端使用的編碼是gbk
set character_set_client=gbk;
//通知服務(wù)器客戶端查看結(jié)果集使用的編碼是 gbk
set character_set_results=gbk;
insert into student(id,name,sex,age) values(3,’王五’,’男’,19);
- 問題二:數(shù)據(jù)庫命令框如果有中文就亂碼
charset gbk;
3.2.3. 刪除數(shù)據(jù)
//刪除單條數(shù)據(jù)
delete from student where id=1;
//刪除所有數(shù)據(jù)坪郭,不刪除結(jié)構(gòu)个从,會放到日志中,事務(wù)提交后才生效
delete from student;
//摧毀表,刪除表中所有數(shù)據(jù)嗦锐,不刪除結(jié)構(gòu)嫌松,立即生效
truncate table student;
注意:delete from student;
與truncate table student;
都能刪除該表中所有數(shù)據(jù),區(qū)別:前者刪除后自增主鍵還在奕污,后者主鍵會從1開始萎羔。
3.2.4. 修改數(shù)據(jù)
//設(shè)置所有人的年齡加10歲
update student set age=age+10
//修改zhangsan 為張三
update student set name=’張三’ where name=’zhangsan’
//修改王五的salery和出生日期
update student set salery=100.01,birthday=’1999-10-10’ where id=3;
3.3 DQL-數(shù)據(jù)庫查詢語言
3.3.1.概念及作用
Data Query Language 數(shù)據(jù)庫查詢語言
3.3.2.數(shù)據(jù)查詢
//刪除student
drop table student
//創(chuàng)建數(shù)據(jù)庫表-學(xué)生成績表
create table student(id int primary key auto_increment,name varchar(20) unique not null,chinese float,english float,math float);
//添加幾條數(shù)據(jù)
insert into student values(1,'張三',90,80,80);
insert into student values(2,'李四',90,87,60);
insert into student values(3,'王五',70,60,69);
insert into student values(4,'趙六',99,90,87);
//查詢所有學(xué)生信息
select * from student;
//查詢id為1的學(xué)生信息
select * from student where id=1;
//查詢id為1的學(xué)生姓名
select name from student where id=1;
//查詢數(shù)學(xué)成績大于80的同學(xué)成績
select * from student where math>80
//查詢所有學(xué)生成績,并輸出效果為 姓名 語文 英語 數(shù)學(xué) 效果碳默,見下圖:
select name as 姓名,chinese as 語文,english as 英語,math as 數(shù)學(xué) from student
//查詢所有成績及數(shù)學(xué)分+10分
select *,(math+10)from student
//統(tǒng)計每個學(xué)生的總分
select name,(math+english+chinese) as 總分 from student
//查詢總分大于230分的同學(xué)
select * from student where (math+english+chinese)>230
//查詢數(shù)學(xué)成績在80-90之間的同學(xué)
select * from student where math between 80 and 90
//查詢數(shù)學(xué)語文英語都大于80的同學(xué)成績
select * from student where math>80 and english>80 and chinese >80;
//查詢數(shù)學(xué)成績在 80 60 90內(nèi)的同學(xué)贾陷,即數(shù)學(xué)成績有60、80嘱根、90的髓废。
select * from student where math in(80,60,90);
//模糊查詢
// _ 代表一個,%代表多個(0 - 無限)
//查詢所有姓名中包含張的同學(xué)
select * from student where name like ‘%張%’
3.3.3. 排序查詢
MySQL中 升序為asc慌洪,降序為desc
例如:
升序:select * from 表名 order by 表中的字段 asc(MySQL中默認(rèn)是升序排列,可不寫) 凑保;
降序:select * from 表名 order by 表中的字段 desc 冈爹;
若要進(jìn)行同時一個升序一個降序 例如:
order by 升序字段 asc,降序字段 desc 欧引;
//按照數(shù)學(xué)成績從小到大查詢
select * from student order by math;
//按照數(shù)學(xué)成績從大到小查詢
select * from student order by math desc;
3.3.4.分頁查詢
limit是mysql的分頁查詢語法:
select * from table limit m,n
其中m是指記錄從m+1開始,频伤,N代表取n條記錄。
//取出第3條至第6條维咸,4條記錄
select * from student limit 2,4
//查詢出數(shù)學(xué)成績由高到低前兩名
select * from student order by math desc limit 0,2;
3.3.5.分組查詢
分組查詢得到結(jié)果是第一次查到的某個組別剂买。
//創(chuàng)建一個訂單表
create table employee(id int,name varchar(20),sex varchar(20),age int);
insert into employee values(1,'sunsan','男',18);
insert into employee values(2,'lisi','男',18);
insert into employee values(3,'wangwu','女',19);
insert into employee values(4,'zhaoliu','男',15);
//分組查詢
select * from employee group by sex;
//分組查詢加條件
select * from employee group by sex having age>18;
- 注意:
1)分組之后查詢的字段最好不要是name等,最好的分組字段和聚合函數(shù)
2)where和having的區(qū)別
①where在分組之前限定癌蓖,如果不滿足條件則不參與分組。having在分組之后限定婚肆,如果不滿足條件租副,則不會被查出來。
②where后不可以跟聚合函數(shù)较性,having可以進(jìn)行聚合函數(shù)判斷用僧。
③having只能和group by一起使用select sex ,avg(math),count from student where math > 70 group by sex having age > 18
3.3.6. 報表查詢
count 個數(shù)
sum 總數(shù)
avg 平均數(shù)
max 最大值
min 最小值
//統(tǒng)計班級里邊有多少學(xué)生
select count(*)from student;
//統(tǒng)計總成績大于250分的人數(shù)
select count(*)from student where (math+english+chinese)>250;
//統(tǒng)計班級里邊各科總成績
select sum(math),sum(english),sum(chinese) from student
//統(tǒng)計所有科目的總成績
select sum(math+english+chinese) from student;
//統(tǒng)計一下語文平均成績
select sum(chinese)/count(*) from student;
select avg(chinese) from student;
//統(tǒng)計一下班級語文最高分和最低分
select max(chinese) from student;
select min(chinese) from student;
//報表查詢訂單根據(jù)名稱合并后,總價格>10000的商品
select * from orders group by product having sum(price) >7000
3.4 數(shù)據(jù)控制語言
數(shù)據(jù)控制語言:簡稱【DCL】(Data Control Language)赞咙,用來定義數(shù)據(jù)庫的訪問權(quán)限和安全級別责循,及創(chuàng)建用戶;關(guān)鍵字:grant等
四攀操、多表設(shè)計
4.1.一對一
一張表的一條記錄一定只能與另外一張表的一條記錄進(jìn)行對應(yīng)院仿,反之亦然。
有時候,為了業(yè)務(wù)歹垫,或者避免一張表中數(shù)據(jù)量過大剥汤,過復(fù)雜,在開發(fā)中會進(jìn)行一對一方式來設(shè)計表排惨。
4.2. 一對多(1方建主表(id為主鍵字段), 多方建外鍵字段)
一個實體的某個數(shù)據(jù)與另外一個實體的多個數(shù)據(jù)有關(guān)聯(lián)關(guān)系吭敢, 一對多的關(guān)系在設(shè)計的時候,需要設(shè)計表的外鍵暮芭。
4.2.1. 班級表和學(xué)生表設(shè)計
部門表和員工表設(shè)計
4.2.2.創(chuàng)建數(shù)據(jù)庫表
- constraint 約束
- foreign key就是表與表之間的某種約定的關(guān)系鹿驼,由于這種關(guān)系的存在,能夠讓表與表之間的數(shù)據(jù)辕宏,更加的完整蠢沿,關(guān)連性更強(qiáng)。
- foreign key語句的式例:FOREIGN KEY(Sno) REFERENCES Student(Sno)
注意:表的外鍵必須是另一張表的主鍵
//創(chuàng)建班級表
create table class(id int primary key auto_increment,name varchar(20));
//創(chuàng)建學(xué)生表
create table student(id int primary key auto_increment,name varchar(20),sex varchar(20),class_id int,constraint foreign key(class_id) references class(id));
//插入班級數(shù)據(jù)
insert into class values(1,'ceshiban');
insert into class values(2,'kaifa');
//插入學(xué)生數(shù)據(jù)
insert into student values(1,'zhangsan','nan',1);
insert into student values(2,'lisi','nan',2);
insert into student values(3,'jingjing','nan',2);
//聯(lián)查
select * from student where class_id=(select id from class where id=2);
補一個外鍵的注意(默認(rèn)是約束): 刪除主鍵信息時匾效,當(dāng)該主鍵字段值在外鍵表中存在時舷蟀,該記錄是不能刪除的。---要把外鍵表是的相關(guān)信息刪除之后面哼,才能刪除野宜。
子查詢:嵌套在其他查詢中的查詢。
4.3魔策、多對多( 3個表= 2個實體表 + 1個關(guān)系表 )
一個實體的數(shù)據(jù)對應(yīng)另外一個實體的多個數(shù)據(jù)匈子,另外實體的數(shù)據(jù)也同樣對應(yīng)當(dāng)前實體的多個數(shù)據(jù)。
一個學(xué)生可以有多個老師闯袒,一個老師可以教多個學(xué)生
解決方案:創(chuàng)建一個中間表虎敦,專門用來維護(hù)多表之間的對應(yīng)關(guān)系,通常是能夠唯一標(biāo)識出數(shù)據(jù)的字段(主鍵)
create table teacher(id int primary key,name varchar(100));
create table student (id int primary key,name varchar(100));
create table teacher_student(teacher_id int,student_id int,constraint foreign key(teacher_id) references teacher(id),constraint foreign key(student_id) references student(id));
insert into teacher values(1,'梁老師');
insert into teacher values(2,'李老師');
insert into student values(1,”張三”);
insert into student values(2,”李四”);
insert into teacher_student values(1,1);
insert into teacher_student values(1,2);
insert into teacher_student values(2,1);
insert into teacher_student values(2,2);
//查詢李老師所教的學(xué)生
select id from teacher where name=’李老師’
select student_id from teacher_student where teacher_id=id
select * from student where id in(select student_id from teacher_student where teacher_id =(select id from teacher where name='李老師'));
//查詢張三的所有老師
select * from teacher where id in(select teacher_id from teacher_student where student_id=(select id from student where name='張三'));
五政敢、 聯(lián)表查詢
分類:內(nèi)連接其徙、外連接、交叉連接
5.1. 初始定義表結(jié)構(gòu)
create table customer(id int primary key auto_increment,name varchar(20),city varchar(20));
create table orders(id int primary key auto_increment,good_name varchar(20),price float(8,2),customer_id int);
insert into customer (name,city) values('李老師','東北');
insert into customer (name,city) values('崔老師','山西');
insert into customer (name,city) values('張老師','內(nèi)蒙');
insert into customer (name,city) values('閆老師','天津');
insert into orders(good_name,price,customer_id) values('電腦',59,1);
insert into orders(good_name,price,customer_id) values('筆記本',88,2);
insert into orders(good_name,price,customer_id) values('吹風(fēng)機(jī)',99,1);
insert into orders(good_name,price,customer_id) values('香水',300,3);
insert into orders(good_name,price,customer_id) values('牛奶',100,6);
5.2.交叉查詢
交叉查詢喷户,又叫笛卡爾積查詢唾那,會將左表和右表的信息,做一個乘積將所有信息查詢出來褪尝,會產(chǎn)生臨時表闹获,比較占用內(nèi)存,生成的記錄數(shù)=表1 X表2
select * from customer,orders;
select * from customer cross join orders;
5.3. 內(nèi)連接查詢
內(nèi)連接河哑,inner join on 查詢兩張表避诽,設(shè)定條件,將兩張表中對應(yīng)的數(shù)據(jù)查詢出來
不會產(chǎn)生笛卡爾積璃谨,不會產(chǎn)生臨時表沙庐,性能高
select * from customer c inner join orders o on c.id=o.customer_id;
select * from customer,orders where customer.id=orders.customer_id;
select * from customer c,orders o where c.id=o.customer_id;
5.4. 左外連接
左外連接 left join on 設(shè)定條件,將兩張表對應(yīng)的數(shù)據(jù)查詢出來,同時將左表自己沒有關(guān)聯(lián)的數(shù)據(jù)也查詢出來
注意:join前面是左轨功,后面是右
select * from customer c left join orders o on c.id=o.customer_id;
5.5. 右外連接
右外連接 right join on 設(shè)定條件旭斥,將兩張表對應(yīng)的數(shù)據(jù)查詢出來,同時將右表自己沒有關(guān)聯(lián)的所有數(shù)據(jù)查詢出來
select * from customer c right join orders o on c.id=o.customer_id;
5.6. 聯(lián)合查詢
select * from customer left join orders on customer.id=orders.customer_id
having price>20;
六古涧、MySQL圖形化工具navicat
6.1. 安裝介紹
6.2. Navicat工具使用步驟
6.2.1. 鏈接垂券,mysql,輸入用戶名羡滑,密碼
6.2.2.新建庫菇爪,鼠標(biāo)點擊右鍵
6.2.3.新建表
七、數(shù)據(jù)庫備份與恢復(fù)
1. 使用圖形界面工具:
2. 使用doc命令:
mysqldump –u用戶名 –p密碼 數(shù)據(jù)庫名>生成的腳本文件路徑
注意柒昏,不要打分號凳宙,不要登錄mysql,直接在cmd下運行
注意职祷,生成的腳本文件中不包含create database語句
mysqldump -uroot -proot host>C:\Users\Administrator\Deskt
op\mysql\1.sql
3. 導(dǎo)入SQL文件
導(dǎo)入文件
刷新即可氏涩,F(xiàn)5刷新
4.恢復(fù)
a)使用圖形界面工具:
b)使用doc命令行:
i.不登錄恢復(fù)
mysql -u用戶名 -p密碼 數(shù)據(jù)庫<腳本文件路徑
注意,不要打分號有梆,不要登錄mysql是尖,直接在cmd下運行
ii.登錄之后恢復(fù)
選擇庫 use 庫名稱
Source sql文件路徑
八、數(shù)據(jù)庫常用性能優(yōu)化(了解)
數(shù)據(jù)庫性能優(yōu)化這塊泥耀,我們考慮比較多的還是查詢這塊饺汹,互聯(lián)網(wǎng)項目對數(shù)據(jù)查詢非常頻繁,對效率痰催,性能要求比較高兜辞。
-
查詢這塊優(yōu)化的話,主要就需要使用索引這種方式夸溶,所謂索引就是建立一種快速查找的方式逸吵,比如我們查字典,有一個ABCD的索引.
-
舉個例子,如果我們創(chuàng)建一個表
create table user(id integer ,name varchar(20),job varchar(20));
如果我們數(shù)據(jù)庫中有1000萬條數(shù)據(jù)蜘醋,當(dāng)我查詢select * from user where name=’張三’
的時候,這種查詢方式就類似于整個數(shù)據(jù)庫的掃描胁塞,效率非常低。
我們可以給這個name設(shè)置一個索引
create index n on user (name);
這是設(shè)置一種普通(normal)索引压语,然后我們查詢的時候,有了這個索引编检,效率就會大大提升胎食,當(dāng)然對于索引,它的方式有BTree類型和Hash類型允懂,是兩種管理數(shù)據(jù)庫索引的方式厕怜,這個我沒有深入研究。這個我們可以自己設(shè)置。默認(rèn)是btree粥航。索引類型的話琅捏,有normal(普通類型)類型、unique(唯一類型)递雀、fulltext全文索引柄延、主鍵索引、非空索引缀程、聚集索引搜吧。
①主鍵索引,primary key 在設(shè)置的時候杨凑,已經(jīng)指定了滤奈,其實也是非空索引。
②非空索引是not null,設(shè)置這種方式的該字段下內(nèi)容不能為空撩满,
③聚集索引(聯(lián)合索引)蜒程,是在設(shè)置多個查詢條件的時候使用。比如 創(chuàng)建一張表伺帘,有名字昭躺,有工作,我們想經(jīng)常頻繁的用到名字和工作它倆結(jié)合在一起來查詢數(shù)據(jù)庫中表的數(shù)據(jù)曼追。這個時候窍仰,可以將名字和工作指定為聚集索引。create index m on user(name,job); 這樣當(dāng)我們指定select * from user where name=xxx and job=xxx的時候礼殊,就會按照索引方式來做驹吮。-
這種優(yōu)化方式就是索引優(yōu)化,在使用索引優(yōu)化方案的時候晶伦,我們需要注意避免在索引字段上使用條件函數(shù)等操作碟狞。
了解:
Show index form orders;查看索引
面試題:
為什么要創(chuàng)建索引呢(優(yōu)點)?
這是因為婚陪,創(chuàng)建索引可以大大提高系統(tǒng)的性能族沃。
①過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性泌参。
②可以大大加快數(shù)據(jù)的檢索速度脆淹,這也是創(chuàng)建索引的最主要的原因。
③可以加速表和表之間的連接沽一,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義盖溺。
④在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間铣缠。
⑤通過使用索引烘嘱,可以在查詢的過程中昆禽,使用優(yōu)化隱藏器,提高系統(tǒng)的性能蝇庭。建立方向索引的不利因素(缺點)
也許會有人要問:增加索引有如此多的優(yōu)點醉鳖,為什么不對表中的每一個列創(chuàng)建一個索引呢?這種想法固然有其合理性哮内,然而也有其片面性盗棵。雖然,索引有許多優(yōu)點牍蜂,但是漾根,為表中的每一個列都增加索引,是非常不明智的鲫竞。這是因為辐怕,增加索引也有許多不利的一個方面。
①創(chuàng)建索引和維護(hù)索引要耗費時間从绘,這種時間隨著數(shù)據(jù)量的增加而增加寄疏。
②索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外僵井,每一個索引還要占一定的物理空間陕截,如果要建立聚簇索引,那么需要的空間就會更大批什。
③當(dāng)對表中的數(shù)據(jù)進(jìn)行增加农曲、刪除和修改的時候,索引也要動態(tài)的維護(hù)驻债,這樣就降低了數(shù)據(jù)的維護(hù)速度乳规。創(chuàng)建方向索引的準(zhǔn)則
索引是建立在數(shù)據(jù)庫表中的某些列的上面。因此合呐,在創(chuàng)建索引的時候暮的,應(yīng)該仔細(xì)考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引淌实。
一般來說冻辩,應(yīng)該在這些列上創(chuàng)建索引。
①在經(jīng)常需要搜索的列上拆祈,可以加快搜索的速度恨闪;
②在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu)放坏;
③在經(jīng)常用在連接的列上凛剥,這些列主要是一些外鍵,可以加快連接的速度轻姿;
④在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引犁珠,因為索引已經(jīng)排序,其指定的范圍是連續(xù)的互亮;
⑤ 在經(jīng)常需要排序的列上創(chuàng)建索引犁享,因為索引已經(jīng)排序,這樣查詢可以利用索引的排序豹休,加快排序查詢時間炊昆;
⑥在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度威根。同樣凤巨,對于有些列不應(yīng)該創(chuàng)建索引。一般來說洛搀,不應(yīng)該創(chuàng)建索引的的這些列具有下列特點:
①對于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引敢茁。這是因為,既然這些列很少使用到留美,因此有索引或者無索引彰檬,并不能提高查詢速度。相反谎砾,由于增加了索引逢倍,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。
②對于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引景图。這是因為较雕,由于這些列的取值很少,例如人事表的性別列挚币,在查詢的結(jié)果中亮蒋,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大忘晤。增加索引宛蚓,并不能明顯加快檢索速度。
③對于那些定義為text, image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引设塔。這是因為凄吏,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少闰蛔。
④當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時痕钢,不應(yīng)該創(chuàng)建索引。這是因為序六,修改性能和檢索性能是互相矛盾的任连。當(dāng)增加索引時,會提高檢索性能例诀,但是會降低修改性能随抠。當(dāng)減少索引時裁着,會提高修改性能,降低檢索性能拱她。因此二驰,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時,不應(yīng)該創(chuàng)建索引秉沼。
九桶雀、數(shù)據(jù)庫性能檢測方式(了解)
在設(shè)計SQL的時候,我們一般會使用explain檢測sql唬复,看是否使用到索引矗积,避免出現(xiàn)整表搜索方式查詢[filesort(不是以索引方式的檢索,我們叫做filesort)](我在這張表中把gender設(shè)置成normal索引敞咧,name沒有任何設(shè)置)
對比看的棘捣,對有索引的字段,在檢測的時候,會顯示是一個引用的key妄均。
explain select*from tb_product where title='';
還可以使用profiling方式檢測數(shù)據(jù)庫執(zhí)行的方式柱锹,可以查詢sql的運行時間。http://www.jb51.net/article/31870.htm
注釋:查看profiling信息丰包,show variables like '%profiling%';
第一步:set profiling=1;(開啟profiling)
第二步運行:select title from tb_product ;
第三步:查看運行時間show profiles;
Duration:持續(xù)時間禁熏,事件花費的時間總計(以毫秒為單位?)