天天看點

SQL-結構化查詢語言SQL基本文法SQL語句分類索引索引優勢劣勢索引分類建立索引的情況不需要建立索引的情況索引失效

SQL基本文法

SQL語句可以單行或者多行書寫,以分号結尾

可以使用空格或者縮進,來增強語句的可讀性

MySQL不區分大小寫,建議關鍵字使用大寫

SQL語句分類

DDL:資料定義語言,對庫表結構的操作。

DML:資料操作語言,對表記錄進行更新(增删改)。

DQL:資料查詢語言,對表的記錄進行查詢。

DCL:資料控制語言,對使用者進行建立及授權。

索引

索引,是幫助MySQL高效擷取資料的資料結構。

索引,目的在于提高查找效率,可以類比字典。

索引,是排好序的快速查找的資料結構。

索引,會影響where和orderby(查找和排序)。

資料本身之外,資料庫還維護着一個滿足特定查找算法的資料結構;

這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實作進階查找算法,

這種資料結構就是索引。

預設一遍都是B+數索引。

索引優勢劣勢

劣勢:

索引也是要占用空間的。

雖然索引提供了查詢速度;但是降低了寫入(插入更新)速度。

索引隻是提供查詢效率的一個因子,需要花大量時間研究優化。

優勢:

提高資料檢索效率,降低資料庫的IO成本。

通過索引對資料排序,降低資料排序成本,降低了cpu的消耗。

索引分類

單值索引,即一個索引隻包含單個列,一個表可以有多個單值索引。

唯一索引,索引列的值必須唯一,但允許有空值。

符合索引,即一個索引包含多個列。

添加索引:

添加主鍵: alter table tb1 add primary key (column_list)

添加唯一索引:alter table tb1 add unique index_name (column_list)

添加一般索引:alter table tb1 add index index_name(column_list)

添加全文索引:alter table tb1 add fulltext index_name(column_list)

索引結構:BTree索引

建立索引的情況

主鍵自動建立唯一索引

頻繁作為查詢條件的列,應該建立索引

查詢中與其他表關聯的字段,外鍵關系建立索引

頻繁更新的字段不适合建立索引

where條件裡用不到的字段,不要建立索引

單鍵索引與組合索引,高并發情況下,傾向于選擇組合索引

查詢中,需要排序的字段

查詢中,統計或者分組的字段

不需要建立索引的情況

表資料很少

經常增删改的列

資料重複且分布均勻。

例如:10w行資料,某列A,隻有兩種狀态且每種狀态分布為50%;那麼一般對A建索引,不會提高查詢效率。

索引的選擇性是指索引列中不同指的數量與表資料量的比值。如果一個表有10w條記錄,表索引列有9w9999個不同值;那麼這個索引的選擇性就是:9w9999 / 10w 約等于 0.999。一個索引的選擇性越接近于1,這個索引的效率就越高。

索引失效

1、使用!= 或者 <> 導緻索引失效

例如:

SELECT a.* FROM coupon_state_manager a WHERE a.customer_id != 101           

2、類型不一緻導緻的索引失效

(1)字段varchar,條件為int,會導緻失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE customer_phone = 13756494953           

(2)字段int,條件字元型,不會導緻索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE customer_id = '101'           

3、函數導緻的索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE DATE(receive_date) = '2020-02-17 14:08:31'           

4、運算符導緻的索引失效

對列進行了(+,-,*,/,!), 那麼都将不會走索引

EXPLAIN SELECT * FROM coupon_state_manager  WHERE customer_id -1 = 100           

5、OR引起的索引失效

(1)or連接配接的字段,都建立了索引,不會失效

(2)or連接配接的字段,如果其中一個沒建立索引,則會是整個索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE customer_id = 101 or coupon_id = 2           

6、模糊搜尋導緻索引失效

(1)'%abc' '%abc%'會導緻索引失效(要查詢的字段,都在索引中,不會失效)

EXPLAIN SELECT * FROM coupon_state_manager  WHERE  customer_name LIKE '%李%'           

(2)'abc%'不會導緻索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE  customer_name LIKE '李%'           

7、NOT IN、NOT EXISTS導緻索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE customer_id NOT IN (100,101)           

8、IS NOT NULL會導緻索引失效

EXPLAIN SELECT * FROM coupon_state_manager  WHERE  customer_name IS NOT NULL           

9、複合索引

Mysql從左到右的使用索引中的字段;

一個查詢可以隻使用索引中的一部分,但隻能是最左側部分。

例如索引是key index (a,b,c)。

可以支援a | a,b| a,b,c 3種組合進行查找,但不支援 b,c進行查找 。

當最左側字段是常量引用時,索引就十分有效。

建立複合索引時,應該仔細考慮列的順序。

對索引中的所有列執行搜尋或僅對前幾列執行搜尋時,複合索引非常有用;

僅對後面的任意列執行搜尋時,複合索引則沒有用處。