今天要解決的問題:如何設計圖書的多級分類問題?數據結構
咱們有不少的圖書,圖書有不少分類。好比:人文-》哲學-》宗教哲學等優化
涉及的統計可能有:某個分類下全部圖書的數量(包括子分類);spa
每一個分類可能有上級分類和下級分類;
設計
什麼是索引
索引,我我的理解是一種對數據作了特殊結構處理的數據結構,它能夠優化咱們查找數據的速度。這些數據以必定數據結構的方式存在(如B樹、哈希)。
爲何使用索引
固然是爲了查詢更快。好的設計是,咱們的大部分查詢都會使用索引。在數據量小的狀況下(小於10W),有沒有索引的影響不是很大,可是當數據量大於10W時,索引的優化仍是很客觀的。
好比:
索引
select * from single_index where id=1024; //有索引,耗時0.00s
select * from single_index where noindex=1024; //無索引,耗時0.03s
索引的類型
primary:一張表中最多隻有一個primary類型的索引,通常狀況下每一個表最好有一個primarykey的索引。它有時會影響表的存儲行爲和寫入行爲。(innodb中,數據按primary key存儲)primary的數值不重複。
index:普通索引,可重複;
字符串
create INDEX testindex ON table (column, ...)
unique:惟一的索引,可爲NULL。會影響insert部分的寫入。支持字段部分索引,varchar的前10個字節。
innodb
create UNIQUE testindex ON table (column, ...)
fulltext(MyIsam):全文索引,通常用在全文搜索時。通常在小項目中使用,若是數據量增加到必定量的狀況,不是很合適。另外,對中文的支持有限。
左前綴
table
對於字符串的索引,能夠指定字段的前N個字節有索引test
對於字符串的索引,可使用:(... where somechar like "abc%")date
對於多列索引,一樣存在順序的規則。如:index (a, b),那麼實際會用到索引的條件是:where a = 123 和 where a= 123 and b = 345; 而:b=345不會使用索引。
使用場景
包含where的場景(select、update、delete)
order by的字段,建議索引,B樹有效
group by的字段,建議給索引,B樹有效
左前綴能夠作樹的數據結構的查詢,如多級分類統計等
判斷一個查詢是否使用索引&遍歷的行數
可能不少人都知道explain,可是會用麼?
type:使用全表遍歷(All)仍是區間遍歷(range)
key:查詢會使用到的索引
key_len:索引長度
rows:可能遍歷的條數