索引的概念
索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針闪金。更通俗的說垫释,數(shù)據(jù)庫索引好比是一本書前面的目錄,能加快數(shù)據(jù)庫的查詢速度唠梨。上述SQL語句,在沒有索引的情況下侥啤,數(shù)據(jù)庫會遍歷全部200條數(shù)據(jù)后選擇符合條件的当叭;而有了相應(yīng)的索引之后,數(shù)據(jù)庫會直接在索引中查找符合條件的選項盖灸。如果我們把SQL語句換成“SELECT * FROM article WHERE id=2000000”科展,那么你是希望數(shù)據(jù)庫按照順序讀取完200萬行數(shù)據(jù)以后給你結(jié)果還是直接在索引中定位呢?上面的兩個圖片鮮明的用時對比已經(jīng)給出了答案(注:一般數(shù)據(jù)庫默認都會為主鍵生成索引)糠雨。
索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照數(shù)據(jù)存放的物理位置為順序的徘跪,而非聚簇索引就不一樣了甘邀;聚簇索引能提高多行檢索的速度,而非聚簇索引對于單行的檢索很快垮庐。
Mysql處理海量數(shù)據(jù)的解決方案
https://www.cnblogs.com/520playboy/p/6275233.html
第一優(yōu)化你的sql和索引松邪;
第二加緩存,memcached,redis哨查;
第三以上都做了后逗抑,還是慢,就做主從復(fù)制或主主復(fù)制寒亥,讀寫分離邮府,可以在應(yīng)用層做,效率高溉奕,也可以用三方工具褂傀,第三方工具推薦360的atlas,其它的要么效率不高,要么沒人維護加勤;
第四如果以上都做了還是慢仙辟,不要想著去做切分同波,mysql自帶分區(qū)表,先試試這個叠国,對你的應(yīng)用是透明的未檩,無需更改代碼,但是sql語句是需要針對分區(qū)表做優(yōu)化的,sql條件中要帶上分區(qū)條件的列粟焊,從而使查詢定位到少量的分區(qū)上冤狡,否則就會掃描全部分區(qū),另外分區(qū)表還有一些坑吆玖,在這里就不多說了筒溃;
第五如果以上都做了,那就先做垂直拆分沾乘,其實就是根據(jù)你模塊的耦合度怜奖,將一個大的系統(tǒng)分為多個小的系統(tǒng),也就是分布式系統(tǒng)翅阵;
第六才是水平切分歪玲,針對數(shù)據(jù)量大的表,這一步最麻煩掷匠,最能考驗技術(shù)水平滥崩,要選擇一個合理的sharding key,為了有好的查詢效率,表結(jié)構(gòu)也要改動讹语,做一定的冗余钙皮,應(yīng)用也要改,sql中盡量帶sharding key顽决,將數(shù)據(jù)定位到限定的表上去查短条,而不是掃描全部的表;
mysql數(shù)據(jù)庫一般都是按照這個步驟去演化的才菠,成本也是由低到高茸时;