索引
索引相當于字典中的查找條件,常用于快速找出某一列中一特定的值,使用索引可以提升查找的速度。
索引的設計原則
1.選擇唯一性
唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄治唤。例如,學生表中學號是具有唯一性的字段糙申。為該字段建立唯一性索引可以很快的確定某個學生的信息宾添。如果使用姓名的話,可能存在同名現(xiàn)象柜裸,從而降低查詢速度缕陕。
2.為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引
經(jīng)常需要ORDER BY疙挺、GROUP BY榄檬、DISTINCT和UNION等操作的字段,排序操作會浪費很多時間衔统。如果為其建立索引鹿榜,可以有效地避免排序操作海雪。
3.為常作為查詢條件的字段建立索引
如果某個字段經(jīng)常用來做查詢條件,那么該字段的查詢速度會影響整個表的查詢速度舱殿。因此奥裸,為這樣的字段建立索引,可以提高整個表的查詢速度沪袭。
4.限制索引的數(shù)目
索引的數(shù)目不是越多越好湾宙。每個索引都需要占用磁盤空間,索引越多冈绊,需要的磁盤空間就越大侠鳄。修改表時,對索引的重構(gòu)和更新很麻煩死宣。越多的索引伟恶,會使更新表變得很浪費時間。
5.盡量使用數(shù)據(jù)量少的索引
如果索引的值很長毅该,那么查詢的速度會受到影響博秫。例如,對一個CHAR(100)類型的字段進行全文檢索需要的時間肯定要比對CHAR(10)類型的字段需要的時間要多眶掌。
6.盡量使用前綴進行索引
如果索引字段的值很長挡育,最好使用值的前綴來索引。例如朴爬,TEXT和BLOG類型的字段即寒,進行全文檢索會很浪費時間。如果只檢索字段的前面的若干個字符召噩,這樣可以提高檢索速度母赵。
7.刪除不再使用或者是很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后蚣常,原有的一些索引可能不再需要市咽。數(shù)據(jù)庫管理員應當定期找出這些索引痊银,將它們刪除抵蚊,從而減少索引對更新操作的影響。
8.遵循最左前綴匹配原則
mysql會一直向右匹配直到遇到范圍查詢(>溯革、<贞绳、between、like)就停止匹配致稀,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)順序的索引冈闭,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到抖单,a,b,d的順序可以任意調(diào)整萎攒。
9.=和in可以亂序
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序遇八,mysql的查詢優(yōu)化器會幫你優(yōu)化成索引可以識別的形式
10.盡量選擇區(qū)分度高的列作為索引
區(qū)分度的公式是count(distinct col)/count(*),表示字段不重復的比例耍休,比例越大我們掃描的記錄數(shù)越少刃永,唯一鍵的區(qū)分度是1,而一些狀態(tài)羊精、性別字段可能在大數(shù)據(jù)面前區(qū)分度就 是0斯够,那可能有人會問,這個比例有什么經(jīng)驗值嗎喧锦?使用場景不同读规,這個值也很難確定,一般需要join的字段我們都要求是0.1以上燃少,即平均1條掃描10條 記錄
11.索引列不能參與計算保持“干凈”
比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引束亏,原因很簡單,b+樹中存的都是數(shù)據(jù)表中的字段值供汛,但進行檢索時枪汪,需要把所有元素都應用函數(shù)才能比較,顯然成本 太大怔昨。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);
12.盡量擴展索引不要新建索引
比如表中已經(jīng)有a的索引雀久,現(xiàn)在要加(a,b)的索引,那么只需要修改原來的索引即可
Mysql索引
1.普通索引:最基本的索引沒有任何的限制
2.唯一索引:索引的列必須唯一 沒有重復值 但是允許有空值
3.主鍵索引:特殊的唯一索引趁舀,不能有空值
4.全文索引:MyISAM引擎生成索引非常耗時
5.組合索引:提高查詢效率 多個字段組合 遵循最左原則
索引的類型
1.B-Tree 索引? 最常見的索引類型? 大部分引擎都支持的 索引類型?
2.hash索引? memory 引擎才支持?
3.R-tree 索引? MyISAM 引擎特有的索引類型 主要運用于地理空間數(shù)據(jù)
4.Full-text? ? MyISAM 引擎特有的索引類型 用于全文索引? ? MySQL5.6? innodb引擎 也支持了? 全文索引?
創(chuàng)建索引
alter和create2種方式創(chuàng)建索引赖捌。 注:create不支持創(chuàng)建主鍵索引
?
createindexin_nameont1(name);
showindexfromt1\G; ? 查看所有的索引\G以更好地閱讀體驗閱讀
dropindexin_nameont1;刪除索引
createuniqueindexun_nameont1(name);#保證 字段列不能有重復值 ??
dropindexun_nameont1;
altertablet1addindexin_name(name);#alter方式創(chuàng)建索引
showindexfromt1\G;
altertablet1dropindexin_name;#刪除索引 ??
altertablet1dropprimarykey;#刪除主鍵 索引 必須先消除自增?
altertablet1modifyidint(11)unsignednotnull;#消除自增
?
altertablet1addprimarykey(id);#創(chuàng)建主鍵索引 ?
altertablet1modifyidint(11)unsignednotnullauto_increment;
altertablet1addunique(name);
altertablet1dropindexname;#沒有索引名稱的 唯一索引?
altertablet1adduniqueun_name(name);#唯一索引 有名字?
altertablet1dropindexun_name;
altertablet3addindexname_age(name,age);#組合索引 最左原則? 創(chuàng)建完組合索引以后 where條件中 必須有 name? 或者name age 條件都有? 否則 這個索引失效
Mysql視圖
關于視圖:
視圖包含行和列,就像一個真實的表矮烹。視圖中的字段就是來自一個或多個數(shù)據(jù)庫中的真實的表中的字段越庇。我們可以向視圖添加 SQL 函數(shù)、WHERE 以及 JOIN 語句奉狈,我們也可以提交數(shù)據(jù)卤唉,就像這些來自于某個單一的表。
注釋:數(shù)據(jù)庫的設計和結(jié)構(gòu)不會受到視圖中的函數(shù)仁期、where 或 join 語句的影響桑驱。
view
?
createviewv_t1asselect*fromt1whereid>3andid <8;#把經(jīng)常查詢的數(shù)據(jù)放到臨時表中 ? 下次直接從臨時表 讀取即可 不用每次都得 數(shù)據(jù)庫參與運算?
showtables;#會看到一個v_t1 臨時表??
select*fromv_t1;
#主表存在? 視圖存在 ? 主表丟失 視圖丟失? 主表恢復? 視圖恢復?
dropviewv_t1;#刪除視圖??
#查看創(chuàng)建視圖的過程
showcreateviewv_t1\G;## \G以更好地閱讀體驗閱讀 ?