新聞中心
mysql--索引優(yōu)化
索引覆蓋是指如果查詢的列恰好是索引的一部分,那么查詢只需要在索引文件上進行,不需要回行到磁盤再找數(shù)據(jù)。這種查詢速度非常快,稱為”索引覆蓋”
目前創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)站空間、綿陽服務器托管、企業(yè)網(wǎng)站設計、牡丹網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
? ? 1查詢頻繁????2區(qū)分度高????3長度小????4盡量能覆蓋常用查詢字段
索引長度直接影響索引文件的大小,影響增刪改的速度,并間接影響查詢速度(占用內(nèi)存多)。因此對于一些長短不同的字節(jié),我們會針對列中的值,從左往右截取部分,來建索引。但是:
1:截的越短, 重復度越高,區(qū)分度越小, 索引效果越不好
2:截的越長, 重復度越低,區(qū)分度越高, 索引效果越好,但帶來的影響也越大--增刪改變慢,并間影響查詢速度.
所以,我們要在 ?區(qū)分度 + 長度 ?兩者上,取得一個平衡( distinct?去重 )
? ? select count (distinct?left (word,6)) / count (*) from tablename;
對于一般的系統(tǒng)應用區(qū)別度能達到 0.1 ,索引的性能就可以接受.
? ? alter table tablename add index word(word(4));
給字符串類型的字段建立索引效率不高,但是必須要經(jīng)常查這個字段怎么建索引?
比如說一個字段url,類型是字符串。那么可以建一個字段 crcurl 來存儲url字段crc32后的值,并給 crcurl 建立索引。
???crc32:循環(huán)冗余校驗。根據(jù)網(wǎng)上數(shù)據(jù)包或計算機文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗碼的一種散列函數(shù),主要用來檢測或校驗數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤。生成的數(shù)字在傳輸或者存儲之前計算出來并且附加到數(shù)據(jù)后面,然后接收方進行檢驗確定數(shù)據(jù)是否發(fā)生變化。一般來說,循環(huán)冗余校驗的值都是32位的整數(shù)。
crc32 是整形,在MySQL中,給整形字段建立索引效率比較高,crc32雖然不能確保唯一性,但是無礙,相同的機率也是極小,關鍵是可以大大減少查詢的范圍,給crcurl這個字段建立索引,查詢的時候帶上crcurl字段就可以利用到索引。
? ? ? ? 不允許翻過100頁(百度搜索一般到70頁左右)?
首先我們直接大數(shù)據(jù)分頁limit 5000000,10? 發(fā)現(xiàn)耗時4.41秒
接下來我們轉(zhuǎn)換方式使用where條件查詢,只耗時0.02秒
? ? ? ? 2次的查詢結(jié)果不一致,這是因為數(shù)據(jù)被物理刪除過有空洞.,因此我們可以追加軟刪除功能
分析:優(yōu)化思路是 不查,少查,查索引,少取.
我們現(xiàn)在必須要查,則只查索引,不查數(shù)據(jù),得到id.
再用id去查具體條目. ?這種技巧就是延遲索引.
? ? 分析:limit是先查詢再越過,也就是說我們先查詢出所有數(shù)據(jù)再進行跳躍,上圖我們越過500W頁,還使用了inner?join? 內(nèi)存并沒有崩掉,這是因為我們子句tmp臨時表中只查詢了id(索引覆蓋,不需要回行去磁盤找數(shù)據(jù)了)然后拿到這10個id?分別查詢這10條數(shù)據(jù) 。
排序可能發(fā)生2種情況:
1:對于覆蓋索引,直接在索引上查詢時,就是有順序的, using index
2:先取出數(shù)據(jù),形成臨時表做filesort(文件排序,但文件可能在磁盤上,也可能在內(nèi)存中)
我們的爭取目標:取出來的數(shù)據(jù)本身就是有序的! 利用索引來排序,那么什么時候發(fā)生索引排序呢?即查詢索引和order by的字段是同一個字段
???goods表中 cat_id與shop_price組成聯(lián)合索引:
select goods_id,cat_id,shop_price from goods where cat_id=4 order by shop_price;????可以直接利用索引來排序,
using where按照shop_price索引取出的結(jié)果,本身就是有序的
? ? ?????select goods_id,cat_id,shop_price from goods order by click_count;
? ? ? ? ? using filesort用到了文件排序,即取出的結(jié)果再次排序
重復索引是指 在同1個列(如age), 或者順序相同的幾個列(age,school), 建立了多個索引,稱為重復索引,重復索引沒有任何幫助,只會增大索引文件,拖慢更新速度。
冗余索引是指2個索引所覆蓋的列有重疊, 稱為冗余索引。比如x,m,列,加索引 index x(x), ?index xm(x,m) x,xm索引, 兩者的x列重疊了, ?這種情況,稱為冗余索引. (mx, xm 不是重復的,因為列的順序不一樣)
mysql 怎么知道索引有沒有用到
假如你有一個表,
SQL
CREATE
TABLE
test_tab
(2
id
INT,
3
name
VARCHAR(10),
4
age
INT,
5
val
VARCHAR(10)6
);你的業(yè)務,有一個查詢,是
SELECT
*
FROM
test_tab
WHERE
name
=
一個外部輸入的數(shù)據(jù)
剛開始,數(shù)據(jù)不多的時候,執(zhí)行效果還不錯。
隨著數(shù)據(jù)量的增加,這個查詢,執(zhí)行起來,越來越慢了。
然后在
name
上面
建立了索引
CREATE
INDEX
idx_test4_name
ON
test_tab
(name
);
這樣,
可以加快前面那個查詢的速度。
但是,某天,你執(zhí)行了下面這個SQL,
發(fā)現(xiàn)速度又慢了
SELECT
*
FROM
test_tab
WHERE
age
=
25
為啥呢?
因為
age
字段上面,沒有索引
索引只在
name
上面有
換句話說,
也就是
WHERE
里面的條件,
會自動判斷,有沒有
可用的索引,如果有,
該不該用。
多列索引,就是一個索引,包含了2個字段。
例如:CREATE
INDEX
idx_test_name_age
ON
test_tab
(name,
age);那么SELECT
*
FROM
test_tabWHEREname
LIKE
'張%'
AND
age
=
25
這樣的查詢,將能夠使用上面的索引。
多列索引,還有一個可用的情況就是,
某些情況下,可能查詢,只訪問索引就足夠了,
不需要再訪問表了。例如:SELECTAVG(
avg
)
AS
平均年齡FROMtest_tabWHEREname
LIKE
'張%'
這個時候,
name
與
age
都包含在索引里面。
查詢不需要去檢索表中的數(shù)據(jù)。
mysql怎么看索引狀態(tài)
SHOW INDEX FROM tbl_name [FROM db_name]
例如,
mysql SHOW INDEX FROM mytable FROM mydb;
mysql SHOW INDEX FROM mydb.mytable;
SHOW KEYS是SHOW INDEX的同義詞。您也可以使用mysqlshow -k db_name tbl_name命令列舉一個表的索引。
SHOW INNODB STATUS語法
SHOW INNODB STATUS
SHOW INDEX會返回表索引信息。其格式與ODBC中的SQLStatistics調(diào)用相似。
SHOW INDEX會返回以下字段:
· Table
表的名稱。
· Non_unique
如果索引不能包括重復詞,則為0。如果可以,則為1。
· Key_name
索引的名稱。
· Seq_in_index
索引中的列序列號,從1開始。
· Column_name
列名稱。
· Collation
列以什么方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
· Cardinality
索引中唯一值的數(shù)目的估計值。通過運行ANALYZE TABLE或myisamchk -a可以更新。基數(shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)來計數(shù),所以即使對于小型表,該值也沒有必要是精確的。基數(shù)越大,當進行聯(lián)合時,MySQL使用該索引的機會就越大。
· Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
· Packed
指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL。
· Null
如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
· Index_type
用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
· Comment
多種評注。
網(wǎng)頁題目:mysql索引效果怎么看,MySQL索引的作用
文章源于:http://ef60e0e.cn/article/hdhppj.html