MySQL隨筆(2)

索引自己是一個獨立的存儲單位,在該單位裏邊有記錄着數據表某個字段和字段對應的物理空間.索引內部有算法支持,能夠說查詢速度很是快. 
聚簇索引;聚簇索引不是單獨的索引而是一種數據存儲方式;
聚簇索引的優勢是訪問的速度更快;缺點是插入速度嚴重依賴插入順序,更新聚簇索引列的代價很高,頁分裂會致使表佔用更多的磁盤空間.
工做原理:首先在索引中查找對應的值,其次根據匹配的索引找到相應的值,而後根據匹配到的索引的紀錄找到相對應的數據行,最後將數據結果集返回給用戶;
索引速度快的緣由: 有算法的技術支持,索引字段與物理地址有直接對應.
優勢: 
能夠給任意字段進行索引;
極大地加快查詢速度;
缺點:
建立和維護都須要時間,而且隨着數據量的提高所耗費的時間也會增長;
須要佔據大量的空間;
將對錶中的數據進行增刪改查時,索引也須要動態維護,下降了數據的維護速度,
索引的類別:
1、單列索引,一個索引中一個索引中只包含一個列,可是一個表中能夠擁有多個單列索引:
普通索引;(index)
惟一索引,容許被索引的數據列包含重複的值(關鍵字爲unique,更多的是爲了不數據重複)容許有空值;
主鍵索引(關鍵字爲primary) 不容許有空值;
2、全文索引
全文索引(fulltext index) myisam能夠設置該索引,只能在myisam引擎上才能使用,只能經過char,varchar,textleixing的字段中才能使用全文索引;
3、組合索引(複合索引):在表中多個字段組合上建立索引只有查詢條件中使用了這些字段的左邊字段時,索引纔會被使用 遵循最左前綴原則.
E.G: index multildx(id,name,age),查詢時按照id,name,age或id,name或id,這些狀況都會觸發索引,age或name,age則不會,這就只最左前綴.
4、空間索引, 空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種: geometry, point, linestring, polygon;要求是引擎是myisam 必須將其聲明爲not null ,主要運用於地圖,遊戲;
其餘 1、外鍵索引,簡稱外鍵,只有innodb存儲引擎的表才能使用外鍵,若是要刪除父表的記錄(分列表),必需要先刪除子表(帶外鍵的表),否則會出錯;
建立惟一索引: create table t1 (id int not null, name char(30) nit null, unique index uniqidx(id));
建立全文索引:create table t2 (id int not null, name char(30) nit null,name nvarchar(50) not null,age int not null, fulltext index FUDEX(name));
建立組合索引:create table t3 (id int not null, name char(30) nit null,name nvarchar(50) not null,age int not null, index dex(id,name,age));
建立空間索引:create table ee(id int not null,name varchar(50) not null,age int not null,a geometry not null,spatial index 11b(a));
建完表格後添加索引: alter table ff add index dexx(name(50));
MySQL的索引類型有不少,可是底層存儲的數據結構都是B_TREE,B樹索引有本身的限制,
若是不是按着索引最左列開始查找就沒法使用索引
使用索引時,不能跳過索引中的列
not in和<>操做沒法使用索引
若是索引中有某列的查詢範圍,則其右邊的全部列都會沒法使用索引
注意: 儘可能避免在索引上的列上使用表達式或函數.
索引列具備選擇性,索引的選擇性是不重複的索引值合表的記錄數的比值;
更新索引統計信息及減小索引碎片: analyze table table_name;算法

 


事務的隔離性的四個級別:
讀取未提交內容(read uncommitted ,也被稱之爲髒讀);
讀取提交內容(read committed);
可重讀(repeatable read),會出現"幻讀"的問題;
可串行化 (serializable),最高級別隔離.
多版本併發控制(multiversion concurrency control).MySQL的默認隔離級別是可重讀,利用MVCC機制來解決幻讀.
多版本併發控制就是在每一行記錄的後面增長兩個隱藏列,記錄建立版本號和刪除版本號,而每個事務在啓動的時候都有一個惟一的遞增的版本號.只有read committed和repeatable read 兩種事務隔離級別纔會使用MVCC,read uncommitted因爲是讀到未提交的,因此不存在版本問題,而serialiazbel會對全部的讀取行進行加鎖;
髒讀: 當一個事物正在訪問數據時,並對數據進行了修改,而這個修改後的數據尚未提交到數據庫中,這時另外一個事務,也在訪問這個數據,而後使用了這個數據;
不可重複讀: 在一個事務中,屢次讀取同一個數據,在這個事務還沒結束時,另外一個事務也訪問該數據,因爲第二個事務的修改,第一個事務讀取到的數據多是不同的,這樣就發生了在同一個事務中兩次讀到的數據是不同的,所以別稱之爲不可重複讀.
幻讀: 是指事務不是獨立執行時的一種現象,第一個事務對錶中的數據進行修改,這種修改涉及到表中的全部數據行,同時,第二種事務也修改這個表中的數據,此次的修改是向表中插入一行數據,這是第一中操做時就會出現有一個數據行沒有被修改的幻覺.
除了事物的三個基本的命令外,還有一個savepoint命令(保存點命令),能夠把一個事務分割成幾個部分,能夠指定在什麼位置進行回滾操做.數據庫

相關文章
相關標籤/搜索