首先是從面試題切入吧,比較常問但不複雜.(摘抄)
q:你們每天這麼大的資料量,都是儲存在關係型資料庫中嗎?
a:是的,我們線上使用的是mysql資料庫
q:每天幾百萬資料,乙個月就是幾千萬了,那你們有沒有對於查詢做一些優化呢?
a:我們在資料庫中建立了一些索引(我現在非常後悔我當時說了這句話)
q:那你能說說什麼是索引嗎?
a:(這道題肯定難不住我啊)索引其實是一種資料結構,能夠幫助我們快速的檢索資料庫中的資料
q:那麼索引具體採用的哪種資料結構呢?
a:(這道題我也背過)常見的mysql主要有兩種結構:hash索引和b+ tree索引,我們使用的是innodb引擎,預設的是b+樹
q:既然你提到innodb使用的b+ 樹的索引模型,那麼你知道為什麼採用b+ 樹嗎?這和hash索引比較起來有什麼優缺點嗎?
q:剛剛我們聊到b+ tree ,那你知道b+ tree的葉子節點都可以存哪些東西嗎?
a:innodb的b+ tree可能儲存的是整行資料,也有可能是主鍵的值
q:那這兩者有什麼區別嗎?
a:(當他問我葉子節點的時候,其實我就猜到他可能要問我聚簇索引和非聚簇索引了)在 innodb 裡,索引b+ tree的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引b+ tree的葉子節點儲存了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引
q:那麼,聚簇索引和非聚簇索引,在查詢資料的時候有區別嗎?
a:聚簇索引查詢會更快?
q:為什麼呢?
a:因為主鍵索引樹的葉子節點直接就是我們要查詢的整行資料了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以後,還需要再通過主鍵的值再進行一次查詢
q:剛剛你提到主鍵索引查詢只會查一次,而非主鍵索引需要回表查詢多次。(後來我才知道,原來這個過程叫做回表)是所有情況都是這樣的嗎?非主鍵索引一定會查詢多次嗎?
a:(額、這個問題我回答的不好,後來我自己查資料才知道,通過覆蓋索引也可以只查詢一次)
q:不知道的話沒關係,想問一下,你們在建立索引的時候都會考慮哪些因素呢?
a:我們一般對於查詢概率比較高,經常作為where條件的字段設定索引
q: 那你們有用過聯合索引嗎?
a:用過呀,我們有對一些表中建立過聯合索引
q:那你們在建立聯合索引的時候,需要做聯合索引多個字段之間順序你們是如何選擇的呢?
a:我們把識別度最高的字段放到最前面
q: 那你知道最左字首匹配嗎?
a:(我突然想起來原來面試官是想問這個,怪自己剛剛為什麼就沒想到這個呢。)哦哦哦。您剛剛問的是這個意思啊,在建立多列索引時,我們根據業務需求,where子句中使用最頻繁的一列放在最左邊,因為mysql索引查詢會遵循最左字首匹配的原則,即最左優先,在檢索資料時從聯合索引的最左邊開始匹配。所以當我們建立乙個聯合索引的時候,如(key1,key2,key3),相當於建立了(key1)、(key1,key2)和(key1,key2,key3)三個索引,這就是最左匹配原則
這位兄嘚面試 我覺得比較能體現當時的情景,同時 從面試上也能看出來,面試難度從小到大,從基礎開始迴圈漸進,(我個人只看面試題就能理解個大概了)
1.提高查詢速度
2.確保資料的唯一性
3.加速表與表之間的連線性
4.使用分組和排序檢索資料時,減少分組和排序的時間
5.全文檢索搜尋優化
1.普通索引: 基本的索引型別,,沒有唯一性的限制。
刪除索引: drop index [indexname] on 『表』
建立索引: create index [indexname] on 『表』(username)
2.唯一索引: 作用是避免表中某列值不重複,與普通索引類似,值可以為空,不同的是,索引列的值必須是唯一,可以有多個
建立索引 create unique index indexname on mytable
(username
(length)
) 修改表結構 alter mytable add unique [indexname] on (
username
(length)
) 建立表的時候直接指定 create table mytable
( id int not null, username varchar(16
) not null, unique [indexname]
(username
(length)
))
3.主鍵索引: 不允許有空值,特殊的唯一索引,在建表的同時建立,(感覺就像是主鍵)
建立索引 create table mytable
( id int not null, username varchar(16
) not null, primary key
(id)
)當然也可以用 alter 命令。
記住:乙個表只能有乙個主鍵。
4.組合索引::為了形象地對比單列索引和組合索引,為表新增多個字段:
建立索引 create table mytable
( id int not null, username varchar(16
) not null, city varchar(50
) not null, age int not null )
為了進一步榨取mysql的效率,就要考慮建立組合索引。
就是將 name, city, age建到乙個索引裡:
alter table mytable add index username_city_age (
username(10
),city,age)
建表時,username長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。
如果分別在 username,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。
雖然此時有了三個索引,但mysql只能用到其中的那個它認為似乎是最有效率的單列索引。
建立這樣的組合索引,其實是相當於分別建立了下面三組組合mysql資料庫索引:
username,city,age
username,city
username,age
為什麼沒有 city,age這樣的組合索引呢?
這是因為mysql組合索引「最左字首」的結果
比如:這個就會用到:
select * from mytable whree username=
"admin"
這個就不會:
select * from mytable whree age=
"20"
首先 ,mysql5.5以上預設的儲存引擎是innodb,只顯示支援b+樹索引,頻繁訪問的表,innodb會自適應建立hash索引,這個hash索引是建立在b+樹上,方便查詢快,使用者無法自己指定.
二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。二叉樹有如下特性:
1、每個結點都包含乙個元素以及n個子樹,這裡0≤n≤2。平衡二叉樹是一種特殊的二叉樹,所以他也滿足前面說到的二叉樹的兩個特性,同時還有乙個特性:2、左子樹和右子樹是有順序的,次序不能任意顛倒。左子樹的值要小於父結點,右子樹的值要大於父結點。
它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。至於b-樹和b+樹請移步
(太多了 ,第一次看能看懂80%)
上面這個樹的詳解
(這個事避開了詳解 ,點中要害,語言簡短精煉的那種)
其實研究下來 ,東西沒有很複雜 但是量多,比較吃資料結構和空間想象力(我是這麼認為,實在不行 拿紙拿筆畫一畫)
要經常提醒自己回過頭看看,很容易忘
每天學點前端知識 關於MEAN
2015 04 13 1.說在前面 開始接觸前端還是老師給的乙個只有 樣式的框架,到現在樂於在網路上搜尋自己感興趣的資訊,每看到乙個自己之前不知道的就會隨手給自己科普一下,然後一段時間過後就會忘記,為了讓自己能夠有自己的知識體系,形成自己的知識樹,so,最終決定還是寫下自己的成長歷程,說不定什麼時候...
學點HTTP知識
又一次感覺到不學無術,被人一問http知識盡然一點也沒答上來,丟人丟到家了啊。平時也看許多的技術文章,為什麼到了關鍵時刻就答不上來呢?確實發現乙個問題,光看是沒有用的,需要實踐。看別人說的頭頭是道自己也覺得理解了,但發現再讓自己複述一遍可能完全就答不上來。這就是因為看別人的文章更像看 腦子裡跟著作者...
學點資料運營的知識
任何一種商業模式,都不能缺少使用者 產品 運營這三種基本的元素 任何乙個產品,都需要配合好的運營體系才能發揮出它對使用者的價值。而所謂的資料運營,就是通過資料來建立產品與使用者之間的關係,資料是最核心的干預手段。很多人想到運營,就把這個崗位與市場啊 策劃啊等等聯絡起來,要求有創意 能拉通 懂業務 如...