MySQL

  1. MySQL是3層還是4層歇盼?
    2.為什么推薦id自增星持?
    3.MRR:mult_range_read
    4.FIC:fast index create

MySQL是3層還是4層炎功?

取決于數(shù)據(jù)類型和數(shù)據(jù)量固翰,索引越小越好围俘;
前綴索引優(yōu)化,減小索引优构;

為什么推薦id自增诵叁?

取決于數(shù)據(jù)庫是不是分布式的,不建議
不是分布式钦椭,推薦拧额,插入數(shù)據(jù),順序后再后面插入數(shù)據(jù)彪腔,中間插入數(shù)據(jù)侥锦,會導致頁的分裂、合并德挣,16k很快恭垦,但是并行操作時出問題;

  1. 回表:

    使用二級索引(輔助索引)時格嗅,沒有發(fā)生索引覆蓋


  1. 索引覆蓋:

    select id from table where name = ?;


  1. 索引下推:

    數(shù)據(jù)存儲在磁盤中番挺,mysql有自己的服務,要跟磁盤發(fā)生交互

    沒有索引下推:先從存儲引擎中根據(jù)一個索引(name)拉取數(shù)據(jù)屯掖;再mysql server根據(jù)另一個字段(age)篩選玄柏;

    缺點:IO量大

    有索引下推:會根據(jù)name,age來獲取數(shù)據(jù)贴铜,不需要server做任何的數(shù)據(jù)篩選粪摘;

    缺點:需要在磁盤上多做數(shù)據(jù)篩選瀑晒,原來的篩選是放在內存中的,現(xiàn)在放在磁盤徘意,查找數(shù)據(jù)的環(huán)節(jié)苔悦,看起來成本比較高,但是數(shù)據(jù)是排序的映砖,所有的數(shù)據(jù)是聚集存放的间坐,所以性能不會有影響,而且整體的IO量會大大減少邑退,反而提升性能竹宋。


  2. 最左匹配:

    4.1 組合索引:(name,age)

    select * from table where name = ? and age=?
    select * from table where name = ?;
    select * from table where age = ?; --不會走索引,不符合最左匹配
    select * from table where age = ? and name = ?  --會走索引,mysql優(yōu)化器:
    CBO:基于成本的優(yōu)化 

MRR:mult_range_read

內存排序地技,--》范圍查找

FIC:fast index creation

插入和刪除數(shù)據(jù):

  1. 先創(chuàng)建一個臨時表蜈七,將數(shù)據(jù)導入臨時表;
  2. 把原始表刪除
  3. 修改臨時表的名字

給當前表添加一個share鎖莫矗,不會創(chuàng)建臨時文件的資源消耗飒硅,還是在源文件中,但是此時如果有人發(fā)起dml操作作谚,很明顯會導致數(shù)據(jù)不一致三娩,索引添加share鎖,讀取時沒有為題的妹懒,但是DML會有問題

  1. 覆蓋索引

1雀监、當發(fā)起一個被索引覆蓋的查詢時,在explain的extra列可以看到using index的信息眨唬,此時就使用了覆蓋索引

2会前、在大多數(shù)存儲引擎中,覆蓋索引只能覆蓋那些只訪問索引中部分列的查詢匾竿。不過瓦宜,可以進一步的進行優(yōu)化,可以使用innodb的二級索引來覆蓋查詢岭妖。

例如:actor使用innodb存儲引擎临庇,并在last_name字段又二級索引,雖然該索引的列不包括主鍵actor_id昵慌,但也能夠用于對actor_id做覆蓋查詢

mysql> explain select actor_id,last_name from actor where last_name='HOPPER'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: actor
   partitions: NULL
         type: ref
possible_keys: idx_actor_last_name
          key: idx_actor_last_name
      key_len: 137
          ref: const
         rows: 2
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

前綴索引實例說明

? 有時候需要索引很長的字符串苔巨,這會讓索引變的大且慢,通常情況下可以使用某個列開始的部分字符串废离,這樣大大的節(jié)約索引空間,從而提高索引效率礁芦,但這會降低索引的選擇性蜻韭,索引的選擇性是指不重復的索引值和數(shù)據(jù)表記錄總數(shù)的比值悼尾,范圍從1/#T到1之間。索引的選擇性越高則查詢效率越高肖方,因為選擇性更高的索引可以讓mysql在查找的時候過濾掉更多的行闺魏。

? 一般情況下某個列前綴的選擇性也是足夠高的,足以滿足查詢的性能俯画,但是對應BLOB,TEXT,VARCHAR類型的列析桥,必須要使用前綴索引,因為mysql不允許索引這些列的完整長度艰垂,使用該方法的訣竅在于要選擇足夠長的前綴以保證較高的選擇性泡仗,通過又不能太長。

案例演示:

--創(chuàng)建數(shù)據(jù)表
create table citydemo(city varchar(50) not null);
insert into citydemo(city) select city from city;

--重復執(zhí)行5次下面的sql語句
insert into citydemo(city) select city from citydemo;

--更新城市表的名稱
update citydemo set city=(select city from city order by rand() limit 1);

--查找最常見的城市列表猜憎,發(fā)現(xiàn)每個值都出現(xiàn)45-65次娩怎,
select count(*) as cnt,city from citydemo group by city order by cnt desc limit 10;

--查找最頻繁出現(xiàn)的城市前綴,先從3個前綴字母開始胰柑,發(fā)現(xiàn)比原來出現(xiàn)的次數(shù)更多截亦,可以分別截取多個字符查看城市出現(xiàn)的次數(shù)
select count(*) as cnt,left(city,3) as pref from citydemo group by pref order by cnt desc limit 10;
select count(*) as cnt,left(city,7) as pref from citydemo group by pref order by cnt desc limit 10;
--此時前綴的選擇性接近于完整列的選擇性

--還可以通過另外一種方式來計算完整列的選擇性,可以看到當前綴長度到達7之后柬讨,再增加前綴長度崩瓤,選擇性提升的幅度已經(jīng)很小了
select count(distinct left(city,3))/count(*) as sel3,
count(distinct left(city,4))/count(*) as sel4,
count(distinct left(city,5))/count(*) as sel5,
count(distinct left(city,6))/count(*) as sel6,
count(distinct left(city,7))/count(*) as sel7,
count(distinct left(city,8))/count(*) as sel8 
from citydemo;

--計算完成之后可以創(chuàng)建前綴索引
alter table citydemo add key(city(7));

--注意:前綴索引是一種能使索引更小更快的有效方法,但是也包含缺點:mysql無法使用前綴索引做order by 和 group by踩官。 

where 條件和 order by 使用相同的索引却桶,并且order by 的順序和索引的順序相同,并且order by 的字段都是升序或降序卖鲤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末肾扰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛋逾,更是在濱河造成了極大的恐慌集晚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件区匣,死亡現(xiàn)場離奇詭異偷拔,居然都是意外死亡,警方通過查閱死者的電腦和手機亏钩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門莲绰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姑丑,你說我怎么就攤上這事蛤签。” “怎么了栅哀?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵震肮,是天一觀的道長称龙。 經(jīng)常有香客問我,道長戳晌,這世上最難降的妖魔是什么鲫尊? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮沦偎,結果婚禮上疫向,老公的妹妹穿的比我還像新娘。我一直安慰自己豪嚎,他們只是感情好搔驼,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疙渣,像睡著了一般匙奴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妄荔,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天泼菌,我揣著相機與錄音,去河邊找鬼啦租。 笑死哗伯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的篷角。 我是一名探鬼主播焊刹,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恳蹲!你這毒婦竟也來了虐块?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘉蕾,失蹤者是張志新(化名)和其女友劉穎贺奠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错忱,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡儡率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了以清。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儿普。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掷倔,靈堂內的尸體忽然破棺而出眉孩,到底是詐尸還是另有隱情,我是刑警寧澤勒葱,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布勺像,位于F島的核電站障贸,受9級特大地震影響,放射性物質發(fā)生泄漏吟宦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一涩维、第九天 我趴在偏房一處隱蔽的房頂上張望殃姓。 院中可真熱鬧,春花似錦瓦阐、人聲如沸蜗侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踏幻。三九已至,卻和暖如春戳杀,著一層夾襖步出監(jiān)牢的瞬間该面,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工信卡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隔缀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓傍菇,卻偏偏與公主長得像猾瘸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丢习,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355