MYSQL深入理解:
?MYSQL的存儲引擎:指用來存儲,處理和保護數(shù)據(jù)的核心服務,也就是數(shù)據(jù)庫的底層軟件組織
InnoBD:是MYSQL5.1之后默認的存儲引擎,支持事務,支持外健,支持崩潰修復和自增
delete drop 和truncate有什么區(qū)別??
1)delete
可用于刪除表中的所有數(shù)據(jù)和部分數(shù)據(jù),他的使用是:
delete from 表名 where+條件 order by 數(shù)字 limit 數(shù)字我們要進行刪除學生表里面數(shù)學排名最高的三個學生:
delete from student order by math desc limit 31)底層實現(xiàn)原理:在InnDB引擎里面,delete并不是真的把數(shù)據(jù)進行刪除了,而是把數(shù)據(jù)打上刪除標記,標記為刪除狀態(tài),我們可以把MYSQL設置成非自動提交模式:
set autocommit=0;
先將第一個數(shù)據(jù)刪除掉,在進行回滾操作
select * from student; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳偉 | | 2 | 李嘉欣 | | 3 | 孫文浩 | +----+-----------+ 3 rows in set (0.00 sec)mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec)mysql> delete from student; Query OK, 3 rows affected (0.00 sec)mysql> rollback; Query OK, 0 rows affected (0.00 sec)mysql> select * from student; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳偉 | | 2 | 李嘉欣 | | 3 | 孫文浩 | +----+-----------+2)對于自增列來說,我們使用delete刪除了所有的數(shù)據(jù)之后,并不會重置自增列為初始值,而是按照原來的列進行自增?
DDL:數(shù)據(jù)定義域,創(chuàng)建一張表,刪除一張表,針對表結(jié)構(gòu)進行操作,定義,定義結(jié)構(gòu)
DML:數(shù)據(jù)表已經(jīng)通過DDL來進行了創(chuàng)建,但是數(shù)據(jù)沒有創(chuàng)建,結(jié)構(gòu)已經(jīng)存在(DDL),但是結(jié)果中沒有數(shù)據(jù),是一種數(shù)據(jù)操縱語言
DCL:歸為事務控制語言,假設該數(shù)據(jù)庫引擎支持事務,提交事務
2)?truncate實現(xiàn)原理:-------不可以進行恢復
基本用法:truncate table+表名
delete可以使用條件表達式來進行刪除部分數(shù)據(jù),但是truncate不能加條件表達式,所以他只能刪除所有數(shù)據(jù),truncate加上了where條件就會報錯
實現(xiàn)原理:truncate看似只刪除了行數(shù)據(jù),但是它本質(zhì)上是DDL語句,delete屬于DML語句,因為truncate本質(zhì)上是新創(chuàng)建了一個表結(jié)構(gòu),再把原來的表整體刪除掉(原來的表結(jié)構(gòu)和數(shù)據(jù)都會刪除),會重置自增列
3)drop是把表結(jié)構(gòu)和行數(shù)據(jù)全部進行刪除------不可以進行恢復
總結(jié)它們的區(qū)別:
1)數(shù)據(jù)恢復方面:delete可以恢復刪除的數(shù)據(jù),但是truncate和drop是不能恢復刪除的數(shù)據(jù)的
2)執(zhí)行速度方面:從執(zhí)行速度來說,delete是進行逐行執(zhí)行的,并且在進行執(zhí)行之后會把操作日志記錄下來,以備日后進行回滾操作使用,所以說delete的執(zhí)行速度是比較慢的,但是truncate實現(xiàn)進行復制一個表結(jié)構(gòu),再把原來的表進行刪除,所以執(zhí)行速度居中,但是drop執(zhí)行速度最快,會刪除表的索引
3)刪除數(shù)據(jù)方面:drop是刪除整張表,包含行數(shù)據(jù)和字段,但是truncate和drop只刪除了行數(shù)據(jù),表結(jié)構(gòu)沒有進行給刪除
4)添加條件:delete可以使用where表達式和group by來進行使用,來進行添加查詢條件,但是truncate和drop不可以添加查詢條件
5)重置自增列:在InnoDB引擎中,truncate可以重置自增列,但是delete不可以
6)delete屬于DML語句,但是drop和truncate屬于DDL語句
聚簇索引和非聚簇索引:
在MYSQL默認存儲引擎中,索引可以大致分成兩類:聚簇索引和非聚簇索引
一:聚簇索引:一般指的就是主鍵索引,是依靠B+樹來進行實現(xiàn)的,在聚簇索引里面葉子結(jié)點存放的是用戶信息的內(nèi)存地址,我們可以使用內(nèi)存地址直接找到對應的行數(shù)據(jù),存放的是行數(shù)據(jù)
1)但是聚簇索引不一定是主鍵索引,當你創(chuàng)建一張表的時候,創(chuàng)建了主鍵,那么聚簇索引就是主鍵索引
2)如果一張表里面沒有主鍵,InnoDB會使用第一個唯一索引unique,況且這個唯一索引使用了非空約束,我們就是用它作為聚簇索引;
3)如果一張表既沒有主鍵索引,又沒有符合條件的唯一索引,那么InnoDB會自動生成一個一個名為gen_cllust_index的隱藏聚簇索引,是6個字節(jié)
二:非聚簇索引:非聚簇索引在InnoDB引擎里面,也叫作二級索引,我們可以看出,在非聚簇索引的葉子節(jié)點存放的并不是真正的行數(shù)據(jù),而是主鍵ID,所以當我們進行使用費聚簇索引進行查詢的時候,首先會得到一個主鍵ID,再根據(jù)主鍵ID去聚簇索引上面進行查詢數(shù)據(jù)會得到真正的行數(shù)據(jù),我們把這個過程稱之為回表查詢
所以他們的區(qū)別是:
1)聚簇索引的葉子結(jié)點存放的是行數(shù)據(jù),而非聚簇索引的葉子結(jié)點存儲的是主鍵ID
2)聚簇索引查詢效率比較高,而非聚簇索引需要進行回表查詢,所以效率上面非聚簇索引不如聚簇索引
3)聚簇索引一般是主鍵索引,而主鍵一張表上面只能有一個,因此聚簇索引一張表也只能有一個,但是非聚簇索引是可以有多個的
SQL查詢語句的注意事項:
在MYSQL中,所有的SQL查詢語法要遵循下面的語法順序:
select?
from?
where
group by
having
order by
limit
注意:1)group by后面不可以加where語句
2)having和group by可以單獨使用:
select * from student having id<5; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳偉 | | 2 | 李嘉欣 | | 3 | 孫文浩 | +----+-----------+ select * from student group by id; +----+-----------+ | id | name | +----+-----------+ | 1 | 李佳偉 | | 2 | 李嘉欣 | | 3 | 孫文浩 | | 4 | 李佳偉 | +----+-----------+select sum(id) from student group by name; +---------+ | sum(id) | +---------+ | 3 | | 5 | | 2 | +---------+having和where有什么區(qū)別?
1)在where的使用過程中,在where語句中不可以使用select中的別名,但是使用having和group by可以使用select中的別名
1)select (chinese+math+english)/3 as avg from student having avg> 50;----成功 2)select (chinese+math+english)/3 as avg from student where avg>30;ERROR 1054 (42S22): Unknown column 'avg' in 'where clause'2)having只能用于select語句當中,但是where可以用在任何語句中
3)having后面的字句可以搭配聚合函數(shù)來進行使用,但是where后面的字句不可以使用聚合函數(shù)
4)having通常是在分組之后進行查詢,where通常是在分組之前進行查詢
char和varchar有什么區(qū)別?
1)長度范圍不同:char的范圍是255,但是varchar的范圍是65535
2)比如說要進行存儲字符"abc",使用char(10),那么實際上在數(shù)據(jù)庫進行存儲的時候,表示存儲的時候最終會占用10個字節(jié),查詢的時候會自動進行截斷尾部空格,但是咱們的varchar(10)實際上進行存儲的時候只會占3個字節(jié)
3)char的存取數(shù)度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多余的空格占位符占據(jù)空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。
4)char的存儲方式是,對英文字符(ASCII)占用1個字節(jié),對一個漢字占用兩個字節(jié);而varchar的存儲方式是,對每個英文字符占用2個字節(jié),漢字也占用2個字節(jié)。
?
總結(jié)
以上是生活随笔為你收集整理的MYSQL深入理解:的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机程序无法启动,应用程序无法正常启动
- 下一篇: 利用纯真IP库建立mysql ip数据库