浙江新華建設(shè)有限公司官方網(wǎng)站站長seo查詢
目錄
?索引
?什么是索引
?索引的數(shù)據(jù)結(jié)構(gòu)
?索引的使用
??事務(wù)
?什么是事務(wù)
?事務(wù)的特性
?事務(wù)的使用
?索引
?什么是索引
索引是存儲在磁盤上的一個(gè)數(shù)據(jù)結(jié)構(gòu),通過索引可以快速地定位到存儲在磁盤上的數(shù)據(jù)。
索引在提高查詢速度的同時(shí),還提高了增刪改(增刪改的同時(shí)還需要額外調(diào)整索引)和空間的開銷(構(gòu)建索引需要額外的磁盤空間)。
?索引的數(shù)據(jù)結(jié)構(gòu)
索引的目的是為了加快查詢速度,在我們已知的數(shù)據(jù)結(jié)構(gòu)中,雖然哈希表查詢的時(shí)間復(fù)雜度(O(1))最低,但哈希表并不能查詢指定范圍的數(shù)據(jù),故并不適合構(gòu)成MySQL里的索引。而二叉搜索樹雖然能查詢指定范圍,但由于是二叉,當(dāng)數(shù)據(jù)量大時(shí),樹的高度就會比較高,元素之間的比較次數(shù)就多,讀硬盤的次數(shù)也就會變多,從而速度就會降低,故也不是很適合構(gòu)成MySQL里的索引。那MySQL里的索引底層到底是什么呢?其實(shí)它的底層是一種名叫B+樹的數(shù)據(jù)結(jié)構(gòu)。
B+樹具有以下特點(diǎn):
①.B+樹是一顆N插搜索樹,每個(gè)節(jié)點(diǎn)有N個(gè)key,N個(gè)key劃分出N個(gè)區(qū)間,最后一個(gè)key為所在區(qū)間的最大值
②.父節(jié)點(diǎn)的key會在子節(jié)點(diǎn)中重復(fù)出現(xiàn),并且是該子節(jié)點(diǎn)的最大值,這樣葉子節(jié)點(diǎn)就包含所有數(shù)據(jù)的全集
③.葉子結(jié)點(diǎn)會以類似鏈表的形式互相連接
B+樹由于是N叉搜索樹,故高度會比二叉搜索樹低,從而讀取硬盤的次數(shù)就比較低;B+樹的所有的查詢都是落在葉子節(jié)點(diǎn)上,中間比較次數(shù)差不多,故查詢操作比較均衡;由于B+數(shù)的葉子節(jié)點(diǎn)包含所有數(shù)據(jù),故只需在葉子節(jié)點(diǎn)存放具體數(shù)據(jù),非葉子節(jié)點(diǎn)只需存放索引值即可,這樣極大節(jié)省了內(nèi)存空間,就有可能將非葉子節(jié)點(diǎn)放進(jìn)內(nèi)存中緩存,進(jìn)一步降低硬盤IO的次數(shù)。
?索引的使用
?查看索引創(chuàng)建主鍵約束( PRIMARY KEY )、唯一約束( UNIQUE )、外鍵約束( FOREIGN KEY )時(shí),會自動創(chuàng)建對應(yīng)列的索引:語法: show index from 表名;mysql> create table student(id int primary key auto_increment, name varchar(20)); Query OK, 0 rows affected (0.06 sec)mysql> show index from student; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | student | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.01 sec)
?創(chuàng)建索引對于非主鍵、非唯一約束、非外鍵的字段,可以創(chuàng)建普通索引:語法: create index 索引名 on 表名(列名);mysql> create index idx_student_name on student(name); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> show index from student; +---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | student | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | | student | 1 | idx_student_name | 1 | name | A | 0 | NULL | NULL | YES | BTREE | | | +---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec)
?刪除索引語法: drop index 索引名 on 表名;mysql> drop index idx_student_name on student; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> show index from student; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | student | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec)
注:
①.創(chuàng)建索引最好是在表創(chuàng)建之初執(zhí)行,如果對已有大量數(shù)據(jù)的表創(chuàng)建索引會吃掉大量磁盤IO,花費(fèi)很長時(shí)間
②.可以使用explain關(guān)鍵字顯示出查詢過程中具體的索引使用情況
③.每個(gè)索引列都有對應(yīng)的B+樹,對于非主鍵列的索引會先查詢該索引列的B+樹,再根據(jù)查詢結(jié)果查詢主鍵列的B+樹
??事務(wù)
?什么是事務(wù)
事務(wù)是指在數(shù)據(jù)庫中進(jìn)行的一組相關(guān)的操作,被當(dāng)作一個(gè)單獨(dú)的工作單元處理,要么全部執(zhí)行,要么全部回滾。
?事務(wù)的特性
事務(wù)具有以下四個(gè)特性:
??Atomicity(原子性):一個(gè)事務(wù)中的所有操作要么全部成功,要么全部失敗,不能只執(zhí)行其中部分操作。
??Consistency(一致性):事務(wù)執(zhí)行前后數(shù)據(jù)庫的狀態(tài)必須保持一致,也就是滿足數(shù)據(jù)庫的約束和規(guī)則。
? Isolation(隔離性):當(dāng)多個(gè)事務(wù)同時(shí)執(zhí)行時(shí),每個(gè)事務(wù)都應(yīng)該被視為獨(dú)立的,不能相互影響。每個(gè)事務(wù)必須獨(dú)立執(zhí)行,并發(fā)執(zhí)行時(shí)不能出現(xiàn)干擾。
? Durability(持久性):事務(wù)完成后,其所作的修改應(yīng)該永久保存在數(shù)據(jù)庫中,即使系統(tǒng)出現(xiàn)故障也不應(yīng)該丟失。
?事務(wù)的使用
MySQL中開啟事務(wù)的語句為start transaction,提交事務(wù)的語句為commit,回滾事務(wù)的語句為rollback。事務(wù)的使用可以保證數(shù)據(jù)的一致性和完整性,避免數(shù)據(jù)損壞和丟失。
mysql> start transaction; Query OK, 0 rows affected (0.00 sec)mysql> insert into student values(1,"張三"); Query OK, 1 row affected (0.02 sec)mysql> update student set name="李四" where name="張三"; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> commit; Query OK, 0 rows affected (0.00 sec)