MySQL數(shù)據(jù)庫部分
【1】MySQL中Where, Group By, Having, Order by執(zhí)行順序?
【例子】按由高到低的順序顯示個(gè)人平均分在70分以上的學(xué)生姓名和平均分,為了盡可能地提高平均分,在計(jì)算平均分前不包括分?jǐn)?shù)在60分以下的成績(jī),并且也不計(jì)算小明(xiaoming)的成績(jī)。?分析:
1.要求顯示學(xué)生姓名和平均分
因此確定第1步select?s_name,avg(s_score)?from?student
2.計(jì)算平均分前不包括分?jǐn)?shù)在60分以下的成績(jī),并且也不計(jì)算小明(xiaoming)的成績(jī)
因此確定第2步wheres_score>=60?and?s_name!=’xiaoming’
3.顯示個(gè)人平均分,相同名字的學(xué)生(同一個(gè)學(xué)生)考了多門科目
因此按姓名分組,確定第3步group?bys_name
4.顯示個(gè)人平均分在70分以上
因此確定第4步having?avg(s_score)>=70
5.按由高到低的順序
因此確定第5步order?byavg(s_score)?desc
完整SQL語句:
select s_name,avg(s_score) from student where s_score>=60 and s_name !='xiaoming' group by s_name having avg(s_score) >=70 order by avg(s_score) desc;
【2】MySQL中myisam與innodb的區(qū)別?
答:兩種類型最主要的差別就是Innodb?支持事務(wù)處理與外鍵和行級(jí)鎖。而MyISAM不支持.所以MyISAM往往就容易被人認(rèn)為只適合在小項(xiàng)目中使用。
【3】數(shù)據(jù)庫優(yōu)化方法
答:1、選取最適用的字段屬性,是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOTNULL;
2.使用連接(JOIN)來代替子查詢(Sub-Queries)
3.使用聯(lián)合(UNION)來代替手動(dòng)創(chuàng)建的臨時(shí)表
4.盡管事務(wù)是維護(hù)數(shù)據(jù)庫完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會(huì)影響數(shù)據(jù)庫的性能,尤其是在很大的應(yīng)用系統(tǒng)中。有些情況下我們可以通過鎖定表的方法來獲得更好的性能。
5.鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵。
6.使用索引。索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。
7.使用索引可以提高查詢的速度,但如果SQL語句使用不恰當(dāng)?shù)脑?,索引將無法發(fā)揮它應(yīng)有的作用。
【4】MySQL中索引的原理是什么?
答:[詳細(xì)參考]


這里設(shè)表一共有三列,假設(shè)我們以Col1為主鍵,則圖8是一個(gè)MyISAM表的主索引(Primary key)示意??梢钥闯鯩yISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復(fù)。如果我們?cè)贑ol2上建立一個(gè)輔助索引,則此索引的結(jié)構(gòu)如下圖所示:

同樣也是一棵B+Tree,data域保存數(shù)據(jù)記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。
MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分。
InnoDB索引實(shí)現(xiàn)
雖然InnoDB也使用B+Tree作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與MyISAM截然不同。
第一個(gè)重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件。從上文知道,MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu),這棵樹的葉結(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄。這個(gè)索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。

