mysql數據庫索引、存儲引擎、事務

1、        事務的四大特性

1.      原子性(Atomicity)

原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。mysql

2.        一致性(Consistency)

一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。算法

拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。sql

3.      隔離性(Isolation)

隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。數據庫

即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。 緩存

4.      持久性(Durability)

持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。安全

2、        事務的四個隔離級別

1.Read uncommitted(未受權讀取、讀未提交)
若是一個事務已經開始寫數據,則另一個事務則不容許同時進行寫操做,但容許其餘事務讀此行數據。該隔離級別能夠經過「排他寫鎖」實現。這樣就避免了更新丟失,卻可能出現髒讀。也就是說事務B讀取到了事務A未提交的數據服務器

2.Read committed(受權讀取、讀提交)
讀取數據的事務容許其餘事務繼續訪問該行數據,可是未提交的寫事務將會禁止其餘事務訪問該行。該隔離級別避免了髒讀,可是卻可能出現不可重複讀。事務A事先讀取了數據,事務B緊接了更新了數據,並提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。數據結構

3.Repeatable read(可重複讀取)
可重複讀是指在一個事務內,屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,即便第二個事務對數據進行修改,第一個事務兩次讀到的的數據是同樣的。這樣就發生了在一個事務內兩次讀到的數據是同樣的,所以稱爲是可重複讀。讀取數據的事務將會禁止寫事務(但容許讀事務),寫事務則禁止任何其餘事務。這樣避免了不可重複讀取和髒讀,可是有時可能出現幻象讀。(讀取數據的事務)這能夠經過「共享讀鎖」和「排他寫鎖」實現。併發

4.Serializable(序列化) 
提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,但不能併發執行。若是僅僅經過「行級鎖」是沒法實現事務序列化的,必須經過其餘機制保證新插入的數據不會被剛執行查詢操做的事務訪問到。序列化是最高的事務隔離級別,同時代價也花費最高,性能很低,通常不多使用,在該級別下,事務順序執行,不只能夠避免髒讀、不可重複讀,還避免了幻像讀。 數據庫設計

5.隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲Read Committed。它可以避免髒讀取,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。大多數數據庫的默認級別就是Read committed,好比Sql Server , Oracle。MySQL的默認隔離級別就是Repeatable read。

3、        數據表結構優化

1.      存儲引擎

1)什麼是存儲引擎

        MySQL中的數據用各類不一樣的技術存儲在文件(或者內存)中。每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。例如,若是你在研究大量的臨時數據,你也許須要使用內存MySQL存儲引擎。內存存儲引擎可以在內存中存儲全部的表格數據。又或者,你也許須要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

    這些不一樣的技術以及配套的相關功能在 MySQL中被稱做存儲引擎(也稱做表類型)。 MySQL默認配置了許多不一樣的存儲引擎,能夠預先設置或者在MySQL服務器中啓用。你能夠選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你須要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。

關係數據庫表是用於存儲和組織信息的數據結構,能夠將表理解爲由行和列組成的表格,相似於Excel的電子表格的形式。有的表簡單,有的表複雜,有的表根本不用來存儲任何長期的數據,有的表讀取時很是快,可是插入數據時去不好;而咱們在實際開發過程當中,就可能須要各類各樣的表,不一樣的表,就意味着存儲不一樣類型的數據,數據的處理上也會存在着差別,那麼。對於MySQL來講,它提供了不少種類型的存儲引擎(或者說不通的表類型),咱們能夠根據對數據處理的需求,選擇不一樣的存儲引擎,從而最大限度的利用MySQL強大的功能。

2.      查看存儲引擎

   Show  engines

SHOW ENGINES 

命令來查看MySQL使用的引擎。

MySQL給用戶提供了諸多的存儲引擎,包括處理事務安全表的引擎和出來了非事物安全表的引擎。

3.      若是要想查看數據庫默認使用哪一個引擎,能夠經過使用命令:

SHOW VARIABLES LIKE 'storage_engine'; 

Show  variables like   「storage_engine」

在MySQL中,不須要在整個服務器中使用同一種存儲引擎,針對具體的要求,能夠對每個表使用不一樣的存儲引擎。Support列的值表示某種引擎是否能使用:YES表示可使用、NO表示不能使用、DEFAULT表示該引擎爲當前默認的存儲引擎。下面來看一下其中幾種經常使用的引擎。

4.       引擎的分類

1)     InnoDB存儲引擎(推薦)

InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵。

InnoDB主要特性

爲MySQL提供了具備提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。InnoDB鎖定在行級而且也在 SELECT語句中提供一個相似Oracle的非鎖定讀。這些功能增長了多用戶部署和性能。在SQL查詢中,能夠自由地將InnoDB類型的表和其餘MySQL的表類型混合起來,甚至在同一個查詢中也能夠混合

InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池[劉1] 。InnoDB將它的表和索引在一個邏輯表空間中,表空間能夠包含數個文件(或原始磁盤文件)。這與MyISAM表不一樣,好比在MyISAM表中每一個表被存放在分離的文件中。InnoDB表能夠是任何尺寸,即便在文件尺寸被限制爲2GB的操做系統上

InnoDB支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,若是沒有顯示在表定義時指定主鍵,InnoDB會爲每一行生成一個6字節的ROWID,並以此做爲主鍵

使用 InnoDB存儲引擎 MySQL將在數據目錄下建立一個名爲 ibdata1的10MB大小的自動擴展數據文件,以及兩個名爲 ib_logfile0和 ib_logfile1的5MB大小的日誌文件

2)     MyISAM存儲引擎

MyISAM基於ISAM存儲引擎,並對其進行擴展。它是在Web、數據倉儲和其餘應用環境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事物。

MyISAM主要特性:

被大文件系統和操做系統支持

當把刪除和更新及插入操做混合使用的時候,動態尺寸的行產生更少碎片。這要經過合併相鄰被刪除的塊,若下一個塊被刪除,就擴展到下一塊自動完成

每一個MyISAM表最大索引數是64,這能夠經過從新編譯來改變。每一個索引最大的列數是16

最大的鍵長度是1000字節,這也能夠經過編譯來改變,對於鍵長度超過250字節的狀況,一個超過1024字節的鍵將被用上

BLOB和TEXT列能夠被索引

NULL被容許在索引的列中,這個值佔每一個鍵的0~1個字節

全部數字鍵值以高字節優先被存儲以容許一個更高的索引壓縮

每一個MyISAM類型的表都有一個AUTOINCREMENT的內部列,當INSERT和UPDATE操做的時候該列被更新,同時AUTOINCREMENT列將被刷新。因此說,MyISAM類型表的AUTOINCREMENT列更新比InnoDB類型的AUTOINCREMENT更快

能夠把數據文件和索引文件放在不一樣目錄

每一個字符列能夠有不一樣的字符集

有VARCHAR的表能夠固定或動態記錄長度

VARCHAR和CHAR列能夠多達64KB

使用MyISAM引擎建立數據庫,將產生3個文件。文件的名字以表名字開始,擴展名之處文件類型:frm文件存儲表定義、數據文件的擴展名爲.MYD(MYData)、索引文件的擴展名時.MYI(MYIndex)

3)     MEMORY存儲引擎

MEMORY存儲引擎將表中的數據存儲到內存中,未查詢和引用其餘表數據提供快速訪問。

MEMORY主要特性:

memory

MEMORY表的每一個表能夠有多達32個索引,每一個索引16列,以及500字節的最大鍵長度

MEMORY存儲引擎執行HASH和BTREE縮影

能夠在一個MEMORY表中有非惟一鍵值

MEMORY表使用一個固定的記錄長度格式

MEMORY不支持blob或TEXT列

MEMORY支持AUTO_INCREMENT列和對可包含NULL值的列的索引

MEMORY表在所由客戶端之間共享(就像其餘任何非TEMPORARY表)

MEMORY表內存被存儲在內存中,內存是MEMORY表和服務器在查詢處理時的空閒中,建立的內部表共享

當再也不須要MEMORY表的內容時,要釋放被MEMORY表使用的內存,應該執行 DELETE FROM或 TRUNCATE TABLE,或者刪除整個表(使用DROP TABLE)/

4)     存儲引擎的選擇

在實際工做中,選擇一個合適的存儲引擎是一個比較複雜的問題。每種存儲引擎都有本身的優缺點,不能籠統地說誰比誰好。但建議選擇使用InnoDB

 

5)     InnoDB引擎與MyISAM引擎與MEMORY的區別?

 

InnoDB: 支持事務處理,支持外鍵,支持崩潰修復能力和併發控制。若是須要對事務的完整性要求比較高(好比銀行),要求實現併發控制(好比售票),那選擇InnoDB有很大的優點。若是須要頻繁的更新、刪除操做的數據庫,也能夠選擇InnoDB,由於支持事務的提交(commit)和回滾(rollback)。

MyISAM: 插入數據快,空間和內存使用比較低。若是表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。若是應用的完整性、併發性要求比 較低,也可使用。

MEMORY: 全部的數據都在內存中,數據的處理速度快,可是安全性不高。若是須要很快的讀寫速度,對數據的安全性要求較低,能夠選擇MEMOEY。它對錶的大小有要求,不能創建太大的表。因此,這類數據庫只使用在相對較小的數據庫表。

注意:同一個數據庫也可使用多種存儲引擎的表。若是一個表要求比較高的事務處理,能夠選擇InnoDB。這個數據庫中能夠將查詢要求比較高的表選擇MyISAM存儲。若是該數據庫須要一個用於查詢的臨時表,能夠選擇MEMORY存儲引擎。

二、字段類型

Php8種數據類型  4標量   (字符串、整型、布爾、浮點) 2  複合  2特殊

Mysql的數據 類型

數值類型、字符串類型、時間和日期類型、符合類型(4種)

1)     .數值類型

Mysql支持全部標準SQL中的數值類型,其中包括嚴格數據類型(INTEGER,SMALLINT,DECIMAL,NUMBERIC),以及近似數值數據類型(FLOAT,REAL,DOUBLE PRESISION),並在此基礎上進行擴展。

擴展後增長了TINYINT,MEDIUMINT,BIGINT這3種長度不一樣的整形,並增長了BIT類型,用來存放位數據。

整數類型        字節       範圍(有符號)      範圍(無符號)          用途 

TINYINT        1字節        (-128,127)          (0,255)            小整數值 

SMALLINT       2字節     (-32 768,32 767)       (0,65 535)         大整數值 

MEDIUMINT      3字節    (-8 388 608,8 388 607) (0,16 777 215)      大整數值 

INT或INTEGER   4字節   (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值 

BIGINT         8字節   (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值 

FLOAT          4字節   (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度浮點數值 

DOUBLE         8字節 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度浮點數值 

DECIMAL 對DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2 依賴於M和D的值 依賴於M和D的值 小數值

2)     字符串類型

 MySQL 提供了6個基本的字符串類型,分別:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、等多種字符串類型。

能夠存儲的範圍從簡單的一個字符到巨大的文本塊或二進制字符串數據。

 

  字符串類型     字節大小         描述及存儲需求

    CHAR         0-255字節          定長字符串 

    VARCHAR      0-255字節          變長字符串 

    TINYBLOB     0-255字節        不超過 255 個字符的二進制字符串 

    TINYTEXT     0-255字節        短文本字符串 

    BLOB         0-65535字節      二進制形式的長文本數據 

    TEXT         0-65535字節      長文本數據 

    MEDIUMBLOB   0-16 777 215字節 二進制形式的中等長度文本數據 

    MEDIUMTEXT   0-16 777 215字節 中等長度文本數據 

    LOGNGBLOB    0-4 294 967 295字節 二進制形式的極大文本數據 

    LONGTEXT     0-4 294 967 295字節 極大文本數據

    VARBINARY(M)                   容許長度0-M個字節的定長字節符串,值的長度+1個字節

    BINARY(M)    M                 容許長度0-M個字節的定長字節符串

3)     日期和時間類型

 在處理日期和時間類型的值時,MySQL 帶有 5 個不一樣的數據類型可供選擇。它們能夠被分紅簡單的日期、時間類型,和混合日期、時間類型。

根據要求的精度,子類型在每一個分類型中均可以使用,而且 MySQL 帶有內置功能能夠把多樣化的輸入格式變爲一個標準格式。

 

 類型     大小(字節)     範圍               格式          用途 

 DATE       4        1000-01-01/9999-12-31 YYYY-MM-DD    日期值 

 TIME       3        '-838:59:59'/'838:59:59' HH:MM:SS    時間值或持續時間 

 YEAR       1         1901/2155               YYYY       年份值 

 DATETIME   8       1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值 

 TIMESTAMP  4       1970-01-01 00:00:00/2037 年某時 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

4)     複合類型

  MySQL 還支持兩種複合數據類型 ENUM 和 SET,它們擴展了 SQL 規範。雖然這些類型在技術上是字符串類型,可是能夠被視爲不一樣的數據類型。

一個 ENUM 類型只容許從一個集合中取得一個值;而 SET 類型容許從一個集合中取得任意多個值。

三、三範式

數據庫設計三範式

第一範式的目標是確保每列的原子性,即數據表中的字段都是單一的屬性的,不可再分。

第二範式是在第一範式的基礎上,確保表中的每列都和主鍵相關,即要求一個表只描述一件事情。

第三範式是在第二範式的基礎上,確保表中每列都和主鍵直接相關,而不是間接相關。間接相關又稱爲傳遞依賴。

第一範式  :

確保每列的原子性,確保每一列不可再分

 

id

地區 address

1

河南省安陽市

2

北京北京海淀區

3

河北雄安

 

 

 

id

1

河南

安陽

2

北京

北京

3

河北

雄安

 

第二範式:

 

非主鍵字段要徹底依賴主鍵字段

 

職工id

職工名稱

職工年齡

性別

地址

 

第三範式:

消除傳遞依賴

根據非主鍵字段能夠推導出另一個字段 這個就是冗餘字段 ,須要把這個字段給消除掉

 

Pid  學號

name

address

sex

age

1

王茂林

 

 

 

2

嘉禾

 

 

 

 

id

pid

name

score

1

1

王茂林

80

2

2

嘉禾

90

3、索引優化(惟一索引、主鍵索引、普通索引、全文索引簡介、聯合索引、空間索引)

1)     什麼是索引?爲何要創建索引?

索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多,若是表中查詢的列有一個索引,MySQL可以快速到達一個位置去搜索數據文件,而沒必要查看全部數據,那麼將會節省很大一部分時間。

 例如:有一張person表,其中有2W條記錄,記錄着2W我的的信息。有一個Phone的字段記錄每一個人的電話號碼,如今想要查詢出電話號碼爲xxxx的人的信息。

 若是沒有索引,那麼將從表中第一條記錄一條條往下遍歷,直到找到該條信息爲止。

 若是有了索引,那麼會將該Phone字段,經過必定的方法進行存儲,好讓查詢該字段上的信息時,可以快速找到對應的數據,而沒必要在遍歷2W條數據了。其中MySQL中的索引的存儲類型有兩種:BTREE、HASH。 也就是用樹或者Hash值來存儲該字段,要知道其中詳細是如何查找的,就須要會算法的知識了。

2)     、MySQL中索引的優勢和缺點和使用原則

      優勢:

       二、全部的MySql列類型(字段類型)均可以被索引,也就是能夠給任意字段設置索引

       三、大大加快數據的查詢速度

      缺點:

       一、建立索引和維護索引要耗費時間,而且隨着數據量的增長所耗費的時間也會增長

       二、索引也須要佔空間,咱們知道數據表中的數據也會有最大上線設置的,若是咱們有大量的索引,索引文件可能會比數據文件更快達到上線值

       三、當對錶中的數據進行增長、刪除、修改時,索引也須要動態的維護,下降了數據的維護速度。

      使用原則:

            經過上面說的優勢和缺點,咱們應該能夠知道,並非每一個字段度設置索引就好,也不是索引越多越好,而是須要本身合理的使用。

       一、對常常更新的表就避免對其進行過多的索引,對常常用於查詢的字段應該建立索引,

       二、數據量小的表最好不要使用索引,由於因爲數據較少,可能查詢所有數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果。

       三、在一同值少的列上(字段上)不要創建索引,好比在學生表的"性別"字段上只有男,女兩個不一樣值。相反的,在一個字段上不一樣值較多但是創建索引。

3)     、索引的分類  

       一、索引咱們分爲四類來說 單列索引(普通索引,惟一索引,主鍵索引)、組合索引、全文索引、空間索引、

          1.一、單列索引:一個索引只包含單個列,但一個表中能夠有多個單列索引。 這裏不要搞混淆了。

             1.1.一、普通索引:

                  MySQL中基本索引類型,沒有什麼限制,容許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。

             1.1.二、惟一索引:

                  索引列中的值必須是惟一的,可是容許爲空值,

             1.1.三、主鍵索引:

                  是一種特殊的惟一索引,不容許有空值。

          1.二、組合索引

               在表中的多個字段組合上建立的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。這個若是還不明白,等後面舉例講解時在細說 

          1.三、全文索引

               全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,經過其中的某個關鍵字等,就能找到該字段所屬的記錄行,好比有"PHP,PHP是最高的語言 ..." 經過PHP,可能就能夠找到該條記錄。這裏說的是可能,由於全文索引的使用涉及了不少細節,咱們只須要知道這個大概意思,若是感興趣進一步深刻使用它,那麼看下面測試該索引時,會給出一個博文,供你們參考。

          1.四、空間索引

空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種GEOMETRY、POINT、LINESTRING、POLYGON。

在建立空間索引時,使用SPATIAL關鍵字。

要求,引擎爲MyISAM,建立空間索引的列,必須將其聲明爲NOT NULL。具體細節看下面  

4)     、索引操做(建立和刪除)

      4.一、建立索引

          4.1.一、建立表的時候建立索引

            格式:create  table 表名[字段名 數據類型]  [unique|fulltext|spattia|...] [劉2] [index|key][劉3]  [索引名字] (字段名[劉4] [length])   [asc|desc][劉5] 

 

使用explain[劉6] 分析sql語句

id: SELECT識別符。這是SELECT的查詢序列號,也就是一條語句中,該select是第幾回出現。在次語句中,select就只有一個,因此是1.

 select_type:所使用的SELECT查詢類型,SIMPLE表示爲簡單的SELECT,不實用UNION或子查詢,就爲簡單的SELECT。也就是說在該SELECT查詢時會使用索引。其餘取值,PRIMARY:最外面的SELECT.在擁有子查詢時,就會出現兩個以上的SELECT。UNION:union(兩張錶鏈接)中的第二個或後面的select語句  SUBQUERY:在子查詢中,第二SELECT。

table:數據表的名字。他們按被讀取的前後順序排列,這裏由於只查詢一張表,因此只顯示book

type:指定本數據表和其餘數據表之間的關聯關係,該表中全部符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄做聯合。ref用於鏈接程序使用鍵的最左前綴或者是該鍵不是 primary key 或 unique索引(換句話說,就是鏈接程序沒法根據鍵值只取得一條記錄)的狀況。當根據鍵值只查詢到少數幾條匹配的記錄時,這就是一個不錯的鏈接類型。可能的取值有 system、const、eq_ref、index和All

possible_keys:MySQL在搜索數據記錄時能夠選用的各個索引,該表中就只有一個索引,year_publication

key:實際選用的索引

key_len:顯示了mysql使用索引的長度(也就是使用的索引個數),當 key 字段的值爲 null時,索引的長度就是 null。注意,key_len的值能夠告訴你在聯合索引中mysql會真正使用了哪些索引。這裏就使用了1個索引,因此爲1,

ref:給出關聯關係中另外一個數據表中數據列的名字。常量(const),這裏使用的是1990,就是常量。

rows:MySQL在執行這個查詢時預計會從這個數據表裏讀出的數據行的個數。

xtra:提供了與關聯操做有關的信息,沒有則什麼都不寫。   

咱們最主要的是看possible_keys和key 這兩個屬性,上面顯示了key爲year_publication。說明使用了索引。

             4.1.1.二、建立惟一索引  

                CREATE TABLE t1

                (

                  id INT NOT NULL,

                  name CHAR(30) NOT NULL,

                  UNIQUE INDEX UniqIdx(id)

                );  

            4.1.1.三、建立主鍵索引

                CREATE TABLE t2

                (

                  id INT NOT NULL,

                  name CHAR(10),

                  PRIMARY KEY(id)

                );  

                

             4.1.1.四、建立單列索引 

                 

 

             4.1.1.五、建立組合索引

解釋最左前綴

組合索引就是聽從了最左前綴,利用索引中最左邊的列集來匹配行,這樣的列集稱爲最左前綴,舉幾個例子就明白了,例如,這裏由id、name和age3個字段構成的索引,索引行中就按id/name/age的順序存放,索引能夠索引下面字段組合(id,name,age)、(id,name)或者(id)。若是要查詢的字段不構成索引最左面的前綴,那麼就不會是用索引,好比,age或者(name,age)組合就不會使用索引查詢

            4.1.1.六、建立全文索引

                全文索引能夠用於全文搜索,但只有MyISAM存儲引擎支持FULLTEXT索引,而且只爲CHAR、VARCHAR和TEXT列服務。索引老是對整個列進行。

 SELECT * FROM 表名WHERE MATCH(字段) AGAINST(查找的數據);

                    

 

                  EXPLAIN SELECT * FROM t4 WHERE MATCH(info) AGAINST('gorlr');

 注意:在使用全文搜索時,須要藉助MATCH函數,而且其全文搜索的限制比較多,好比只能經過MyISAM引擎,好比只能在CHAR,VARCHAR,TEXT上設置全文索引。好比搜索的關鍵字默認至少要4個字符,好比搜索的關鍵字過短就會被忽略掉。等等,若是大家在實驗的時候可能會實驗不出來。

    ◆ 任何過於短的詞都會被忽略。 全文搜索所能找到的詞的默認最小長度爲 4個字符。

  ◆ 中止字中的詞會被忽略。禁用詞就是一個像「the」 或「some」 這樣過於日常而被認爲是不具語義的詞。存在一個內置的中止字, 但它能夠經過用戶自定義列表被改寫。

  詞庫和詢問中每個正確的單詞根據其在詞庫和詢問中的重要性而被衡量。  經過這種方式,一個出如今許多文件中的單詞具備較低的重要性(並且甚至不少單詞的重要性爲零),緣由是在這個特別詞庫中其語義價值較低。反之,假如這個單詞比較少見,那麼它會獲得一個較高的重要性。而後單詞的重要性被組合,從而用來計算該行的相關性。

(五)、總結

    MySQL的索引到這裏差很少就講完了,總結一下咱們到目前爲止應該知道哪些東西

     一、索引是幹嗎的?爲何要有索引?

     二、索引的分類

                            單列索引(普通索引,惟一索引,主鍵索引)、組合索引、全文索引、空間索引、

     三、索引的操做

            給表中建立索引,添加索引,刪除索引,刪除索引  


 [劉1]1.緩衝池(buffer pool)

 a)  描述

 

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

 

  緩衝池中的數據庫類型有:索引頁、數據庫頁、undo頁、插入緩存頁(insert buffer)、自適應hash(adaptive hashindex)、innodb存儲的鎖信息(lock info)、數據字典信息(data dictionary)。

  InnoDB工做方式:將數據文件按頁(每頁16K)讀入InnoDBbuffer pool,而後按最近最少使用算法(LRU)保留緩存數據,最後經過必定頻率將髒頁刷新到文件。

2.重作日誌緩衝池(redo log buffer)

 

mysql> show variables like 'innodb_log_buffer_size';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| innodb_log_buffer_size | 8388608 |
+------------------------+---------+
1 row in set (0.00 sec)

 

3.額外的內存池(additional memory pool)

 

mysql> show variables like 'innodb_additional_mem_pool_size';
+---------------------------------+---------+
| Variable_name                   | Value   |
+---------------------------------+---------+
| innodb_additional_mem_pool_size | 8388608 |
+---------------------------------+---------+
1 row in set (0.00 sec)

 

 [劉2]設置什麼樣的索引(惟1、全文等)

 [劉3]索引關鍵字

 [劉4]對哪一個字段設置索引

 [劉5]對索引進行排序

 [劉6][explain做用

查看sql的執行計劃,幫助咱們分析mysql是如何解析sql語句的。

查看錶的加載順序。查看sql的查詢類型。哪些索引可能被使用,哪些索引又被實際使用了。表之間的引用關係。一個表中有多少行被優化器查詢。其餘額外的輔助信息。]

相關文章
相關標籤/搜索