mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出
前言
上篇文章我們學(xué)習(xí)了數(shù)據(jù)庫(kù)和數(shù)據(jù)表操作語(yǔ)句,今天我們學(xué)習(xí)下數(shù)據(jù)庫(kù)索引,視圖,導(dǎo)入和導(dǎo)出的知識(shí)。
作為基礎(chǔ)篇,不會(huì)涉及到關(guān)于索引和視圖的高級(jí)應(yīng)用和核心概念,但是基本操作大家會(huì)了解,尤其是關(guān)于索引的內(nèi)容,學(xué)會(huì)建立恰當(dāng)?shù)乃饕梢源蟠筇岣邤?shù)據(jù)庫(kù)的查詢效率,后續(xù)會(huì)深入拓展相關(guān)知識(shí),敬請(qǐng)關(guān)注呀~
(想看看周末還有多少愛(ài)學(xué)習(xí)的小伙伴,你們?cè)谀睦镅?#xff0c;O(∩_∩)O哈哈~)
1、目錄
- 索引
- 視圖
- 導(dǎo)入
- 導(dǎo)出
2、步驟
在正式開(kāi)始本實(shí)驗(yàn)內(nèi)容之前,需要先下載相關(guān)代碼。
該代碼可以新建一個(gè)數(shù)據(jù)庫(kù),名為 mysql_shiyan ,并在 mysql_shiyan 數(shù)據(jù)庫(kù)中建 4 個(gè)表(department,employee,project,table_1),然后向其中插入數(shù)據(jù)。
其中創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表語(yǔ)句可以在這里下載。
git clone https://github.com/rongweihe/MoreThanCode/tree/master/mysql_shiyan/SQL;下載完成后,輸入命令開(kāi)啟 MySQL 服務(wù)并使用 root 用戶登錄:
#打開(kāi) MySQL 服務(wù) sudo service mysql start#使用 root 用戶登錄 mysql -u root下載的 SQL6 目錄下,有兩個(gè)文件 MySQL-06.sql 和 in.txt,其中第一個(gè)文件用于創(chuàng)建數(shù)據(jù)庫(kù)并向其中插入數(shù)據(jù),第二個(gè)文件用于測(cè)試數(shù)據(jù)導(dǎo)入功能。
如果之前的數(shù)據(jù)庫(kù)還存在,首先把 mysql_shiyan 數(shù)據(jù)庫(kù)刪掉,執(zhí)行命令:
source /home/MySQL_05_01.sql;輸入命令運(yùn)行第一個(gè)文件,搭建數(shù)據(jù)庫(kù)并插入數(shù)據(jù):
mysql> source /home/mysql_sql/SQL6/MySQL-06.sql;3、索引
索引是一種可以提高數(shù)據(jù)庫(kù)檢索速度的一種數(shù)據(jù)結(jié)構(gòu)。它的作用相當(dāng)于一本書(shū)的目錄,可以根據(jù)目錄中的頁(yè)碼快速找到需要的內(nèi)容。
當(dāng)表中有大量記錄的時(shí)候,若需要對(duì)表進(jìn)行查詢,沒(méi)有索引的情況下,走的是全表搜索;將所有記錄一一取出,和查詢條件進(jìn)行對(duì)比,然后返回滿足條件的記錄。
這樣的方式會(huì)執(zhí)行大量磁盤(pán) I/O 操作,并花費(fèi)大量數(shù)據(jù)庫(kù)系統(tǒng)的時(shí)間。
而如果在表中已經(jīng)建立索引,在索引中找到符合查詢條件的索引值,通過(guò)索引值就可以快速找到表中的數(shù)據(jù),可以大大地加快查詢的速度
對(duì)一張表中的某個(gè)列建立索引,有以下兩種語(yǔ)句格式:
ALTER TABLE 表名字 ADD INDEX 索引名 (列名); CREATE INDEX 索引名 ON 表名字 (列名);我們用這兩種語(yǔ)句分別建立索引:
ALTER TABLE employee ADD INDEX idx_id (id); #在employee表的id列上建立名為idx_id的索引CREATE INDEX idx_name ON employee (name); #在employee表的name列上建立名為idx_name的索引索引的效果是加快查詢速度,當(dāng)表中數(shù)據(jù)不夠多的時(shí)候是感受不出它的效果的。這里我們使用命令 SHOW INDEX FROM 表名字; 查看剛才新建的索引:
在使用 SELECT 語(yǔ)句查詢的時(shí)候,語(yǔ)句中 WHERE 里面的條件,會(huì)自動(dòng)判斷有沒(méi)有可用的索引。
比如有一個(gè)用戶表,它擁有用戶名(username)和個(gè)人簽名(note)兩個(gè)字段。其中用戶名具有唯一性,并且格式有一定的限制,我們給用戶名加上一個(gè)唯一索引;個(gè)性簽名格式多變,而且允許不同用戶使用重復(fù)的簽名,不加任何索引。
這時(shí)候,如果要查找某一用戶,使用語(yǔ)句
select * from user where username=?和select * from user where note=?性能是有很大差距的,對(duì)建立了索引的用戶名進(jìn)行條件查詢會(huì)比沒(méi)有索引的個(gè)性簽名條件查詢快幾倍,在數(shù)據(jù)量大的時(shí)候,這個(gè)差距會(huì)更大。
意:一些字段不適合創(chuàng)建索引,比如性別,這個(gè)字段存在大量的重復(fù)記錄,索引帶來(lái)的效率在這里就不太合適,甚至?xí)侠蹟?shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)冗余和額外的 CPU 開(kāi)銷(xiāo)。
具體原因涉及到聚集索引和非聚集索引,我們后面在深入展開(kāi)。
比如下面的例子:可以看到相同的 sql,加索引之后比不加索引慢許多。
4、視圖
視圖是從一個(gè)或多個(gè)表中導(dǎo)出來(lái)的表,是一種虛擬存在的表。它就像一個(gè)窗口,通過(guò)這個(gè)窗口可以看到系統(tǒng)專(zhuān)門(mén)提供的數(shù)據(jù),這樣,用戶可以視圖是從一個(gè)或多個(gè)表中導(dǎo)出來(lái)的表,是一種虛擬存在的表。
它就像一個(gè)窗口,通過(guò)這個(gè)窗口可以看到系統(tǒng)專(zhuān)門(mén)提供的數(shù)據(jù),這樣,用戶可以不用看到整個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),而只關(guān)心對(duì)自己有用的數(shù)據(jù)。
注意理解視圖是虛擬的表:
- 數(shù)據(jù)庫(kù)中只存放了視圖的定義,而沒(méi)有存放視圖中的數(shù)據(jù),這些數(shù)據(jù)存放在原來(lái)的表中;
- 使用視圖查詢數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)從原來(lái)的表中取出對(duì)應(yīng)的數(shù)據(jù);
- 視圖中的數(shù)據(jù)依賴于原來(lái)表中的數(shù)據(jù),一旦表中數(shù)據(jù)發(fā)生改變,顯示在視圖中的數(shù)據(jù)也會(huì)發(fā)生改變;
- 在使用視圖的時(shí)候,可以把它當(dāng)作一張表。
創(chuàng)建視圖的語(yǔ)句格式為:
CREATE VIEW 視圖名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;可見(jiàn)創(chuàng)建視圖的語(yǔ)句,后半句是一個(gè) SELECT 查詢語(yǔ)句,所以視圖也可以建立在多張表上,只需在 SELECT 語(yǔ)句中使用子查詢或連接查詢。
現(xiàn)在我們創(chuàng)建一個(gè)簡(jiǎn)單的視圖,名為 v_emp,包含 v_name,v_age,v_phone 三個(gè)列:
CREATE VIEW v_emp (v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;5、導(dǎo)入
我們來(lái)學(xué)習(xí)一下,如何導(dǎo)入一個(gè)純數(shù)據(jù)文件,該文件中將包含與數(shù)據(jù)表字段相對(duì)應(yīng)的多條數(shù)據(jù),這樣可以快速導(dǎo)入大量數(shù)據(jù),除此之外,還有可以用 SQL 語(yǔ)句的導(dǎo)入方式,語(yǔ)法為:source *.sql 這是實(shí)驗(yàn)中經(jīng)常用到的。
兩者之間的不同是:數(shù)據(jù)文件導(dǎo)入方式只包含數(shù)據(jù),導(dǎo)入規(guī)則由數(shù)據(jù)庫(kù)系統(tǒng)完成;SQL 文件導(dǎo)入相當(dāng)于執(zhí)行該文件中包含的 SQL 語(yǔ)句,可以實(shí)現(xiàn)多種操作,包括刪除,更新,新增,甚至對(duì)數(shù)據(jù)庫(kù)的重建。
數(shù)據(jù)文件導(dǎo)入,可以把一個(gè)文件里的數(shù)據(jù)保存進(jìn)一張表。
導(dǎo)入語(yǔ)句格式為:
LOAD DATA INFILE '文件路徑和文件名' INTO TABLE 表名字;現(xiàn)在 SQL6 目錄下有一個(gè)名為 in.txt 的文件,我們嘗試把這個(gè)文件中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù) mysql_shiyan 的 employee 表中。
由于導(dǎo)入導(dǎo)出大量數(shù)據(jù)都屬于敏感操作,根據(jù) mysql 的安全策略,導(dǎo)入導(dǎo)出的文件都必須在指定的路徑下進(jìn)行,在 mysql 終端中查看路徑變量:(我這里設(shè)置了任意目錄可以導(dǎo)入)
注意到 secure_file_priv 變量指定安全路徑 ,要導(dǎo)入數(shù)據(jù)文件,需要將該文件移動(dòng)到安全路徑下。
secure-file-priv 參數(shù)是用來(lái)限制mysql導(dǎo)入導(dǎo)出到哪個(gè)目錄的。
查閱官方文檔找到secure-file-priv的值有以下幾種情況:
使用命令 vim SQL6/in.txt 查看 in.txt 文件中的內(nèi)容:
可以看到其中僅僅包含了數(shù)據(jù)本身,沒(méi)有任何的 SQL 語(yǔ)句
再使用以下命令以 root 用戶登錄數(shù)據(jù)庫(kù),再連接 mysql_shiyan 數(shù)據(jù)庫(kù):
查看一下沒(méi)有導(dǎo)入數(shù)據(jù)之前,employee 表中的數(shù)。
現(xiàn)在執(zhí)行導(dǎo)入語(yǔ)句,文件中的數(shù)據(jù)成功導(dǎo)入 employee 表:
6、導(dǎo)出
導(dǎo)出與導(dǎo)入是相反的過(guò)程,是把數(shù)據(jù)庫(kù)某個(gè)表中的數(shù)據(jù)保存到一個(gè)文件之中。導(dǎo)出語(yǔ)句基本格式為:
SELECT 列1,列2 INTO OUTFILE '文件路徑和文件名' FROM 表名字;注意:語(yǔ)句中 “文件路徑” 之下不能已經(jīng)有同名文件。
如果導(dǎo)出報(bào)錯(cuò),可能是 MySQL 沒(méi)有權(quán)限對(duì)相應(yīng)目錄進(jìn)行操作, 查看系統(tǒng)變量 tmpdir, 如下所示,tmpdir 變量指定路徑為 /tmp。
現(xiàn)在我們把整個(gè) employee 表的數(shù)據(jù)導(dǎo)出到 /var/tmp/mysql-files/ 目錄下,導(dǎo)出文件命名為 out.txt 具體語(yǔ)句為:
SELECT * INTO OUTFILE '/var/tmp/mysql-files/out.txt' FROM employee;用 vim 可以查看導(dǎo)出文件 /var/tmp/mysql-files/out.txt 的內(nèi)容:也可以使用 sudo cat /var/tmp/mysql-files/out.txt 命令查看。
數(shù)據(jù)導(dǎo)出成功。
7、總結(jié)
在本節(jié)實(shí)驗(yàn)中我們學(xué)習(xí)了索引、視圖、導(dǎo)入和導(dǎo)出的知識(shí)。
今天的學(xué)習(xí)就到這里啦。
參考:
https://www.shiyanlou.com/courses/9
原作者:herongwei
原文鏈接:從零開(kāi)始學(xué)習(xí) MySQL 系列--索引、視圖、導(dǎo)入和導(dǎo)出
原出處:公眾號(hào)
侵刪
總結(jié)
以上是生活随笔為你收集整理的mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 变频空调1.5匹加氟多少个压
- 下一篇: 武汉首套有经营贷,再买房算几套?