本文對數(shù)據(jù)庫Mysql做了一些介紹滚澜,望對你有所幫助耕渴。
(1)使用了brew進行安裝
brew install mysql
/usr/bin/mysqladmin -u root password "111111"http://對初始密碼修改宿饱。
(2)文件所屬位置
/usr/share/mysq/下是安裝目錄
/var/lib/mysql/下是mysql數(shù)據(jù)庫塌忽、錯誤日志和socket文件
/usr/bin/文件下存儲著mysql的各種命令
/etc/init.d/ 可用來啟動和停止mysql服務(wù)
/etc/my.cnf是mysql的配置文件
netstat -tanp | grep mysql 查看端口號(3306)
(3)初始登錄退出操作
登錄mysql : mysql -u root -p 密碼
啟動/關(guān)閉/重新啟動 service mysqld start/stop/restart
(4)數(shù)據(jù)庫的增刪改查
create database shujuku;//創(chuàng)建數(shù)據(jù)庫
show databases;//顯示數(shù)據(jù)庫列表
drop database shujuku;// 刪除數(shù)據(jù)庫
use shujuku;//選擇要使用的數(shù)據(jù)庫
create table stud(name varchar(20) , age int ,score float);//創(chuàng)建表
show tables;//顯示表
drop table stud;刪除表
alter table stud rename to studinfo;修改表名
alter table stud add address char(40);//向表中增加字段
alter table stud modify address char(10);//修改字段的數(shù)據(jù)類型
alter table stud drop address;//刪除字段
desc stud;//查看表中有哪些字段
insert into stud values(‘zhang san’,20,98.6),(‘xiao ming’,19,60);//插入數(shù)據(jù)
select *from stud where age >= 20 and score < 60;//查詢信息
delete from stud where name = ‘zhang san’;//刪除信息
update stud set age = 25 where name = ‘xiao ming’;//更新信息
2院仿、數(shù)據(jù)庫中的視圖
視圖:它是一種虛擬的表毙玻,是從數(shù)據(jù)庫中一個或多個表中導(dǎo)出來的表豌蟋。使用視圖查詢數(shù)據(jù)時,數(shù)據(jù)庫會從原來的表中取出對應(yīng)的數(shù)據(jù)桑滩。
創(chuàng)建視圖:
a梧疲、在單表上創(chuàng)建視圖(這里列舉了一個例子)
create view department_view1(name,function,location)
as select d_name,function,address
from department;
b、在多表上創(chuàng)建視圖(這里列舉了一個例子)
create algorithm = merge view
worker_view1(name,deparment,sex,age,address)
as select name,deparment.d_name,sex,2009-birthday,address
from worker,deparment
where worker.d_id = deparment.d_id
with local check option;
查看視圖
DESCRIBE worker_view1;(縮寫:DESC worker_view1)//查看視圖的定義
show table status like worker_view1;//查看視圖基本信息
3运准、使用正則表達式查詢信息
Example:
select * from info where name REGEXP ‘^l’;//從info 表的name 字段中查詢以字母‘l’開頭的記錄
select * from info where name REGEXP ‘c$’;//從info 表的name 字段中查詢以字母‘c’結(jié)尾的記錄
select * from info where name REGEXP ‘^l..y$’;//從info 表的name 字段中查詢以字母‘l’開頭,以字母y結(jié)尾幌氮,中間兩個任意字符的記錄
select * from info where name REGEXP ‘a(chǎn)*c’;//從info 表的name 字段中查詢字母‘c’之前出現(xiàn)過0個或多個‘a(chǎn)’的記錄
select * from info where name REGEXP ‘a(chǎn)+c’;//從info 表的name 字段中查詢字母‘c’之前出現(xiàn)過至少一個‘a(chǎn)’的記錄)
4、mysql性能優(yōu)化
目的:為了使mysql數(shù)據(jù)庫運行速度更快胁澳、占用的磁盤空間更小该互。
數(shù)據(jù)庫管理員可以使用如下語句查詢mysql數(shù)據(jù)庫的性能:
show status like 'value';
(1)查詢優(yōu)化:
explain select * from student \G //分析select 語句的執(zhí)行情況
上述字段的含義如下:
使用索引,創(chuàng)建索引韭畸,如:
create index index_name on student(name);//在name字段上建立一個名為index_name 的索引
(2)優(yōu)化數(shù)據(jù)庫結(jié)構(gòu):
a宇智、將字段很多的表分解成為一個表
b、增加中間表
有時候需要經(jīng)常查詢兩個表中的幾個字段胰丁,如果經(jīng)常進行鏈表查詢随橘,會降低mysql的查詢速度,因此可將這幾個字段抽取出來單獨建立一個表锦庸,然后從兩個表中將數(shù)據(jù)導(dǎo)入進來机蔗。
c、增加冗余字段
d甘萧、優(yōu)化插入記錄的速度
1>禁用索引
2>禁用唯一性檢查
3>優(yōu)化insert語句
e萝嘁、分析表、檢查表和優(yōu)化表
分析表的作用是檢查關(guān)鍵字的分布---->
檢查表的作用是檢查表是否存在錯誤---->
優(yōu)化表的主要作用是消除刪除或者更新造成的空間浪費--->
5扬卷、數(shù)據(jù)庫中的觸發(fā)器
觸發(fā)器是由insert牙言、update、delete 等事件來觸發(fā)某種特定操作邀泉,滿足觸發(fā)器的觸發(fā)條件時嬉挡,數(shù)據(jù)庫系統(tǒng)就會執(zhí)行觸發(fā)器中定義的程序語句钝鸽,這樣做可以保證某些操作之間的一致性。
創(chuàng)建觸發(fā)器:
有一個執(zhí)行語句的觸發(fā)器:
有多個執(zhí)行語句的觸發(fā)器:
6庞钢、數(shù)據(jù)庫復(fù)制原理
分三步:
(1)主服務(wù)器把數(shù)據(jù)更新記錄到二進制日志中拔恰;
(2)從服務(wù)器把主服務(wù)器的二進制日志拷貝到自己的中繼日志中;
(3)從服務(wù)器重做中繼日志的時間基括,把更新應(yīng)用到自己的數(shù)據(jù)庫上颜懊;
注:從服務(wù)器有兩個線程:一個是I/O線程,負(fù)責(zé)讀取主服務(wù)器的二進制日志风皿,并將其拷貝到自己的中繼日志中河爹;另一個是SQL 線程,負(fù)責(zé)復(fù)制執(zhí)行中繼日志桐款。
7咸这、數(shù)據(jù)庫中事務(wù)的概念
事務(wù):作為單個邏輯工作單元執(zhí)行的一系列操作。
事務(wù)滿足4個特性:
(1)原子性(Atomic):事務(wù)要么全部執(zhí)行魔眨,要么全都不執(zhí)行媳维,不可能只處理一個子集。
(2)一致性(Consistent):事務(wù)在完成時遏暴,必須確保所有的數(shù)據(jù)都處于一致狀態(tài)侄刽。
(3)隔離性(Insulation):由并發(fā)事務(wù)所做的修改必須與其他任何并發(fā)事務(wù)所做的修改隔離,通過“鎖”實現(xiàn)朋凉。通常有四種隔離級別:read uncommited(讀取未提交的內(nèi)容州丹,也稱為臟讀),read committed(讀取提交內(nèi)容杂彭,支持不可重復(fù)讀)墓毒,repeatable read(可重讀,這是MySQL 的默認(rèn)事務(wù)隔離級別盖灸,會導(dǎo)致幻讀蚁鳖,即當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行赁炎,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時醉箕,會發(fā)現(xiàn)有新的“幻影” 行),serializable(可串行化徙垫,它通過強制事務(wù)排序讥裤,使之不可能相互沖突,從而解決幻讀問題)
(4)持久性(Duration):事務(wù)完成之后姻报,它對于系統(tǒng)的影響是持久的己英,既使出現(xiàn)致命的系統(tǒng)故障。
8吴旋、myisam與innodb损肛、Memory的差別
(1)MyISAM引擎
MyISAM引擎是MySQL默認(rèn)的存儲引擎厢破,MyISAM不支持事務(wù)和行級鎖,所以MyISAM引擎速度很快治拿,性能優(yōu)秀摩泪。MyISAM可以對整張表加鎖,支持并發(fā)插入劫谅,支持全文索引见坑。
//如果你不需要事務(wù)支持,通常我們建表時都選用MyISAM存儲引擎捏检,像新聞表之類都沒有必要支持事務(wù)荞驴。
(2)InnoDB引擎
InnoDB是專為事務(wù)設(shè)計的存儲引擎,支持事務(wù)贯城,支持外鍵熊楼,擁有高并發(fā)處理能力。但是冤狡,InnoDB在創(chuàng)建索引和加載數(shù)據(jù)時孙蒙,比MyISAM慢项棠。
//涉及到貨幣操作一般都需要支持事務(wù)悲雳,什么都能錯,錢不能出錯香追。
(3)Memory引擎(采用哈希索引)
內(nèi)存表合瓢,Memory引擎將數(shù)據(jù)存儲在內(nèi)存中,表結(jié)構(gòu)不是存儲在內(nèi)存中的透典,查詢時不需要執(zhí)行磁盤I/O操作晴楔,所以要比MyISAM和InnoDB快很多倍,但是數(shù)據(jù)庫斷電或是重啟后峭咒,表中的數(shù)據(jù)將會丟失税弃,表結(jié)構(gòu)不會丟失.
//如果你需要將SESSION數(shù)據(jù)存在數(shù)據(jù)庫中,那么使用Memory引擎是個不錯的選擇凑队。
9则果、數(shù)據(jù)庫范式的概念
1NF:第一范式。如果關(guān)系模式R的所有屬性的值域中每一個值都是不可再分解的值漩氨,則稱R屬于第一范式模式西壮。
2NF:第二范式。如果關(guān)系模式R是第一范式叫惊,并且R中每一個非主屬性完全函數(shù)依賴于R的某個候選鍵款青,則稱R為第二范式。
3NF:第三范式霍狰。如果關(guān)系模式R是第二范式抡草,并且R中每一個非主屬性都不傳遞依賴于R的候選鍵饰及,則稱R為第三范式。
BCNF:BC范式康震,如果關(guān)系模式R是第一范式旋炒,且且每個屬性都不傳遞依賴于R的候選鍵,則稱R為BCNF的模式签杈。
4NF:第四范式瘫镇。把同一表內(nèi)的多對多關(guān)系刪除。
10答姥、數(shù)據(jù)庫中索引的深入理解
索引是一種數(shù)據(jù)結(jié)構(gòu)铣除。
InnoDB存儲引擎支持的幾種常見索引:
B+樹索引:并不能找到一個給定健值的具體行,B+樹索引只能找到被查找數(shù)據(jù)行所在的頁鹦付,然后從數(shù)據(jù)庫將頁讀入內(nèi)存尚粘,在內(nèi)存中查找。B+樹索引可以分為聚集索引和輔助索引敲长。
(1)聚集索引
這棵樹的葉節(jié)點data域保存了完整的數(shù)據(jù)記錄郎嫁。這個索引的key是數(shù)據(jù)表的主鍵。按照表的主鍵構(gòu)建一顆B+樹祈噪。鍵值的邏輯順序決定了表中對應(yīng)行(記錄集)在邏輯地址上是連續(xù)的泽铛,注意:很多書上說是在物理地址上連續(xù),其實是指邏輯地址連續(xù)辑鲤。
聚集索引查詢速度快盔腔,葉子節(jié)點的數(shù)據(jù)就是用戶需要查詢的數(shù)據(jù)。聚集索引對于那些經(jīng)常要搜索范圍值的列特別有效月褥。
(2)輔助索引
葉節(jié)點的data域存放的是數(shù)據(jù)記錄的地址弛随,如果指定的Key存在,則取出其data域的值宁赤,然后以data域的值為地址舀透,讀取相應(yīng)數(shù)據(jù)記錄(MYISAM采用此種索引方式)
注:不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引决左,過長的主索引會令輔助索引變得過大愕够。
Myisam 和InnoDB索引的區(qū)別:
第一個重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件。從上文知道哆窿,MyISAM索引文件和數(shù)據(jù)文件是分離的链烈,索引文件僅保存數(shù)據(jù)記錄的地址。挚躯。
第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址强衡。
11、數(shù)據(jù)庫中倒排表的概念
對包含有大量數(shù)據(jù)對象的數(shù)據(jù)表或文件進行搜索時码荔,最常用的是針對對象的主關(guān)鍵碼建立索引漩勤。主關(guān)鍵碼可以唯一地標(biāo)識該對象感挥。用主關(guān)鍵碼建立的索引叫做主索引。主索引的每個索引項給出對象的關(guān)鍵碼和對象在表或文件中的存放地址越败。
但在實際應(yīng)用中有時需要針對其它屬性進行搜索触幼。
因此,除主關(guān)鍵碼外究飞,可以把一些經(jīng)常搜索的屬性設(shè)定為次關(guān)鍵碼置谦,并針對每一個作為次關(guān)鍵碼的屬性,建立次索引亿傅。在次索引中媒峡,列出該屬性的所有取值,并對每一個取值建立有序鏈表葵擎,把所有具有相同屬性值的對象按存放地址遞增的順序或按主關(guān)鍵碼遞增的順序鏈接在一起谅阿。次索引的索引項由次關(guān)鍵碼、鏈表長度和鏈表本身等三部分組成酬滤。
如下圖是一個關(guān)于主索引和次索引的例子:
倒排表或倒排文件是一種次索引的實現(xiàn)签餐。在次索引中記錄對象存放位置的指針可以用主關(guān)鍵碼表示,可以通過搜索次索引確定該對象的主關(guān)鍵碼盯串,再通過搜索主索引確定對象的存放地址氯檐。在倒排表中各個屬性鏈表的長度大小不一,管理起來比較困難嘴脾。為此引入單元式倒排表男摧。
在單元式倒排表中,索引項中不存放對象的存儲地址译打,存放該對象所在硬件區(qū)域的標(biāo)識。
硬件區(qū)域可以是磁盤柱面拇颅、磁道或一個頁塊奏司,以一次 I / O 操作能存取的存儲空間作為硬件區(qū)域為最好。為使索引空間最小樟插,在索引中標(biāo)識這個硬件區(qū)域時可以使用一個能轉(zhuǎn)換成地址的二進制數(shù)韵洋,整個次索引形成一個(二進制數(shù)的) 位矩陣。
12黄锤、mysql中的varchar與char
(1)varchar與char的區(qū)別
char是固定長度的搪缨,而varchar需要增加一個長度標(biāo)識,處理的時候需要多一次運算鸵熟,所以相對來說char比varchar更快副编。
(2)varchar(50)中50的含義
最多存放50個字節(jié)
(3)int(20)中20的含義
20代表整型的最大顯示寬度,整數(shù)的最大范圍是255
13流强、innodb 有多少種日志
錯誤日志:記錄出錯信息痹届,也記錄一些警告信息或者正確的信息
慢查詢?nèi)罩荆涸O(shè)置一個閾值呻待,將運行時間超過該值的所有SQL 語句都記錄到慢查詢的日志文件中。
二進制日志:記錄對數(shù)據(jù)庫執(zhí)行更改的所有操作
查詢?nèi)罩荆河涗浰袑?shù)據(jù)庫請求的信息队腐,不論這些請求是否得到了正確的執(zhí)行蚕捉。
14、存儲過程
是用戶定義的一系列SQL語句的集合柴淘,涉及特定表或其他對象的任務(wù)迫淹,用戶可以調(diào)用存儲過程。
15为严、SQL注入式攻擊:攻擊者將SQL命令插入到web表單的輸入域或頁面請求的查詢字符串中千绪,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中梗脾,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動態(tài)SQL命令荸型,或作為存儲過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊炸茧。
防范SQL注入式攻擊:
思想-->在利用表單輸入的內(nèi)容構(gòu)造SQL命令之前瑞妇,把所有輸入的內(nèi)容過濾一番。過濾輸入內(nèi)容的方式有以下幾中:
一梭冠、替換單引號辕狰,把所有單獨出現(xiàn)的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義控漠。
二蔓倍、對于用來執(zhí)行查詢的數(shù)據(jù)庫賬戶,限制其權(quán)限盐捷。用不同的用戶執(zhí)行查詢偶翅、插入、更新碉渡、刪除操作聚谁。
三、用存儲過程來執(zhí)行所有的查詢滞诺。SQL參數(shù)的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊形导。此外,它使得數(shù)據(jù)庫權(quán)限可以被限制到只允許特定的存儲過程執(zhí)行习霹,所有的用戶輸入必須遵從被調(diào)用存儲過程的安全上下文朵耕。
四、檢查用戶輸入的合法性淋叶,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)阎曹。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶端和服務(wù)器端都執(zhí)行。
五、將用戶登錄名稱芬膝、密碼等數(shù)據(jù)加密保存望门。
六、檢查提取數(shù)據(jù)的查詢所返回的記錄數(shù)量锰霜。如果程序只要求返回一個記錄筹误,但實際返回的記錄卻超過一行,那就當(dāng)做出錯處理癣缅。
16厨剪、查詢:
Order by默認(rèn)的查詢結(jié)果是按升序排列的。加DESC是按降序排列的友存。
Group by將查詢結(jié)果按某個字段或多個字段進行分組查詢祷膳,字段中值相等的為一組:
(1)Group by與Group_Concat()函數(shù)一起使用,每個分組中的字段值都會顯示出來屡立。
eg:select sex,GROUP_CONCAT(name) from employee GROUP BY sex;
(2)Group by與集合函數(shù)一起使用直晨,可以通過集合函數(shù)計算分組中的總記錄、最大值膨俐、最小值勇皇。
eg:select sex,COUNT(sex) from employee GROUP BY sex;
(3)Group by與HAVING一起使用,可以限制輸出的結(jié)果,只有滿足條件表達式的結(jié)果才會顯示焚刺。
eg:select sex,COUNT(sex) from employee GROUP BY sex HAVING COUNT(sex)>=3;
(4)Group by與WITH ROLLUP一起使用,將會在所有記錄的最后加上一條記錄敛摘,這條記錄是上面所有記錄的總和。
使用SQL語句建立一張臨時表:
create table #Temp(字段1 類型乳愉,字段2 類型)兄淫;
------end--------