㈠ mysql之字元串欄位添加索引
字元串創建索引方式:
1、直接創建完整索引,比較佔用空間。
2、創建前綴索引,節省空間,但會增加查詢掃描次數,並且不能使用覆蓋索引。
3、倒序存儲,在創建前綴索引,用於繞過字元串本身前綴的卻分度不夠的問題。
4、創建hash欄位索引,查詢性能穩定,有額外的存儲和計算消耗。
倒序存儲和hash欄位索引都不支持范圍查詢。倒序存儲的欄位上創建的所有是按照倒序字元串的方式排序的。hash欄位的方式也只能支持等值查詢。
mysql> alter table SUser add index index1(email); :包含了每個記錄的整個字元串
或
mysql> alter table SUser add index index2(email(6)); :-對於每個記錄只取前6個位元組
全欄位索引操作流程
使用的是 index1(即 email 整個字元串的索引結構),執行順序是這樣的:
1、從 index1 索引樹找到滿足索引值是』 [email protected] 』的這條記錄,取得 ID2 的值;
2、到主鍵上查到主鍵值是 ID2 的行,判斷 email 的值是正確的,將這行記錄加入結果集;
3、取 index1 索引樹上剛剛查到的位置的下閉宴一條記錄,發現已經不滿足 email=' [email protected] 』的條件了,循環結束。
前綴欄位索引操作流程
如果使用的是 index2(即 email(6) 索引結構),執行順序是這樣的:
1、從 index2 索引樹找到滿足索引值是』zhangs』的記錄,找到的第一侍燃個是 ID1;
2、到主鍵上查到主鍵值是 ID1 的行,判斷出 email 的值不是』 [email protected] 』,這行記錄丟棄;
3、取 index2 上剛剛查到的位置的下一條記錄,發現仍然是』zhangs』,取出 ID2,再到 ID 索引上取整行然後判斷,這次值對了,將這行記錄加入結果集;
4、重復上一步,直到在 idxe2 上取到的值不是』zhangs』時,循環結束。
倒序查詢和hash欄位的區別
它們的區別,主要體現在以下三個方面:
1、從佔用的額外空間來看,倒序存儲方式在主鍵索引上,不會消耗額外的存儲空間,而 hash 欄位方法需要增加一個欄位。當然,倒序存儲方式使用 4 個位元組的前綴長度應該是不夠的,如果再長一點,這個消耗跟額外這個 hash 欄位也差不多抵消了。
2、在 CPU 消耗方面,倒序方式每次寫和讀的時候,都需要額外調用一次 reverse 函數,而 hash 欄位的方式需要額外調用一次 crc32() 函數。如果只從這兩個函數的計算復雜度來看的話,reverse 函數額外消耗的 CPU 資源會更小些。
3、從查詢效率上看,使用 hash 欄位方式的查詢性能相對更穩定一些。因為 crc32 算出來的值雖然有沖突的概率,但是概率非常小,可以認為每次查詢的平轎談銀均掃描行數接近 1。而倒序存儲方式畢竟還是用的前綴索引的方式,也就是說還是會增加掃描行數。
㈡ mysql 多大數據量適合建索引
mysql
1、表的主鍵、外鍵必須有索引;
2、數據量超過300的表應該有索引;
3、經常與其他表進行連接的表,在連接欄位上應該建立索引;
4、經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;
5、索引應該建在選擇性高的欄位上;
6、索引應該建在小欄位上,對於大的文本欄位甚至超長欄位,不要建索引;
7、頻繁進行數據操作的表,不要建立太多的索引;
8、刪除無用的索引,避免對執行計劃造成負面影響;
㈢ mysql 數據量大 加了索引 聚類查詢還是慢
可以根據條件去添加索引,
一、
所有mysql索引列類型都可以被索引,對來相關類使用索引可以提高select查詢性能,根據mysql索引數,可以是最大索引與最小索引,每種存儲引擎對每個表的至少支持16的索引。總索引長度為256位元組。
mysim和innodb存儲引擎的表默認創建索引都是btree索引,目前mysql還不支持函數索引,但支持前緣索引,對欄位前N個字元創建索引
二、mysql創建索引語法
Create [unioun|fulltext|spatial] index indexname[using indextype] on tablename( tablenamecol)
index_col_name:
col_name[ (length)][asc |desc]
如果你創建索引時搞錯了,需要修改mysql索引我們可以用alert來修改索引,語法與create index創建索引差不多,我們就不說了,可以查看相關手冊。
下面我們來看一個關於mysql創建索引實例教程。
mysql>create index cityname on city(city(2));
Query Ok,600 rows affected (0.26 sec)
Records :600 Duplicates:0 Warings 0:
我們現在來以city為條件進行查詢,如下面。
->explain select * from city where city ='www.111cn.net' G
id:1
......
possible_keys:cityname
key:cityname
好了,現在我們來看看mysql刪除索引等實例
Drop indexname on tablename
實例,我現在要刪除剛才創建city索引
>drop index cityname on city;
Query ok, .....
不過通常對百萬級數據的查詢或者其他操作,都改換其他的大型的資料庫了