Mysql

1.

SELECT Customer,SUM(OrderPrice)

FROM Orders

GROUP BY Customer.

2.

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.Id_P = Orders.Id_P

3.explain

Using temporary 看到這個的時候,查詢需要優(yōu)化了。這里,MYSQL需要創(chuàng)建一個臨時表來存儲結(jié)果

Using index: 列數(shù)據(jù)是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發(fā)生在對表的全部的請求列都是同一個索引的部分的時候

use filesort orderby 那一行建立索引

索引:(索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)

1.選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。

例如,學(xué)生表中學(xué)號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學(xué)生的信息。

如果使用姓名的話,可能存在同名現(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ù)庫管理

員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

8.小表不應(yīng)建立索引;包含大量的列并且不需要搜索非空值的時候可以考慮不建索引

having:跟在統(tǒng)計函數(shù)后面

SELECT column_name, aggregate_function(column_name)

FROM table_name

WHERE column_name operator value

GROUP BY column_name

HAVING aggregate_function(column_name) operator value

mysql

1:基礎(chǔ)sql語句書寫(一般讓寫關(guān)聯(lián)和子查詢語句)

關(guān)聯(lián):SELECT?*?FROM?score,?student?WHERE?score.id?=?student.id?...

子查詢:where,having,group by,order by,limit

#查詢每個欄目下價格最高的

select cat_id,max(goods_price) from goos group by cat_id;

#查出價格最高的商品編號

select goods_id,max(goods_price) from goods group by goods_id;

#求每個欄目的商品平均價格

select cat_id,avg(goods_price) from goods group by cat_id;

#查詢本店商品價格比市場價低多少錢,輸出低200元以上的商品

select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;

//這里不能用where因為s是查詢結(jié)果,而where只能對表中的字段名篩選

如果用where的話則是:

select goods_id,goods_name from goods where market_price - shop_price > 200;

2:索引的創(chuàng)建,優(yōu)缺點,最左原則

3:存儲引擎,常用的幾個,優(yōu)缺點,差別,原理(面試必出

4:sql注入的處理方法

5:mysql處理函數(shù)(PHP中封裝的)

連接,預(yù)處理(編譯一次,不同參數(shù)多次執(zhí)行),執(zhí)行

6:PDO的使用方法,為什么使用

在php5.3.6之后,pdo不會在本地對sql進行拼接然后將拼接后的sql傳遞給mysql server處理(也就是不會在本地做轉(zhuǎn)義處理)。pdo的處理方法是在prepare函數(shù)調(diào)用時,將預(yù)處理好的sql模板(包含占位符)通過mysql協(xié)議傳遞給mysql server,告訴mysql server模板的結(jié)構(gòu)以及語義。當(dāng)調(diào)用execute時,將兩個參數(shù)傳遞給mysql server。由mysql server完成變量的轉(zhuǎn)移處理。將sql模板和變量分兩次傳遞,即解決了sql注入問題。

7:mysql的優(yōu)化,表拆分等

8:事務(wù)處理,sql語句的處理效率等

一系列操作,要么全部成功,否則會到操作前

在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。

事務(wù)處理可以用來維護數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行,要么全部不執(zhí)行。

事務(wù)用來管理 insert,update,delete 語句

Atomicity(原子性)、Consistency(穩(wěn)定性)、Isolation(隔離性)、Durability(可靠性)

1、事務(wù)的原子性:一組事務(wù),要么成功;要么撤回。

2、穩(wěn)定性 :有非法數(shù)據(jù)(外鍵約束之類),事務(wù)撤回。

3、隔離性:事務(wù)獨立運行。一個事務(wù)處理后的結(jié)果,影響了其他事務(wù),那么其他事務(wù)會撤回。事務(wù)的100%隔離,需要犧牲速度。

4、可靠性:軟、硬件崩潰后,InnoDB數(shù)據(jù)表驅(qū)動會利用日志文件重構(gòu)修改??煽啃院透咚俣炔豢杉娴?, innodb_flush_log_at_trx_commit 選項 決定什么時候吧事務(wù)保存到日志里。

9:數(shù)據(jù)表字段的類型,同類型間的區(qū)別,改如何選取,int(10)與int(11)的區(qū)別等。

10:數(shù)據(jù)庫索引使用的那種數(shù)據(jù)結(jié)構(gòu),畫出數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)庫事務(wù)的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務(wù)的并發(fā)操作中可能會出現(xiàn)臟讀,不可重復(fù)讀,幻讀。下面通過事例一一闡述它們的概念與聯(lián)系。

Read uncommitted

讀未提交,顧名思義,就是一個事務(wù)可以讀取另一個未提交事務(wù)的數(shù)據(jù)。

事例:老板要給程序員發(fā)工資,程序員的工資是3.6萬/月。但是發(fā)工資時老板不小心按錯了數(shù)字,按成3.9萬/月,該錢已經(jīng)打到程序員的戶口,但是事務(wù)還沒有提交,就在這時,程序員去查看自己這個月的工資,發(fā)現(xiàn)比往常多了3千元,以為漲工資了非常高興。但是老板及時發(fā)現(xiàn)了不對,馬上回滾差點就提交了的事務(wù),將數(shù)字改成3.6萬再提交。

分析:實際程序員這個月的工資還是3.6萬,但是程序員看到的是3.9萬。他看到的是老板還沒提交事務(wù)時的數(shù)據(jù)。這就是臟讀。

那怎么解決臟讀呢?Read committed!讀提交,能解決臟讀問題。

Read committed

讀提交,顧名思義,就是一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)。

事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬),當(dāng)他埋單時(程序員事務(wù)開啟),收費系統(tǒng)事先檢測到他的卡里有3.6萬,就在這個時候??!程序員的妻子要把錢全部轉(zhuǎn)出充當(dāng)家用,并提交。當(dāng)收費系統(tǒng)準備扣款時,再檢測卡里的金額,發(fā)現(xiàn)已經(jīng)沒錢了(第二次檢測金額當(dāng)然要等待妻子轉(zhuǎn)出金額事務(wù)提交完)。程序員就會很郁悶,明明卡里是有錢的…

分析:這就是讀提交,若有事務(wù)對數(shù)據(jù)進行更新(UPDATE)操作時,讀操作事務(wù)要等待這個更新操作事務(wù)提交后才能讀取數(shù)據(jù),可以解決臟讀問題。但在這個事例中,出現(xiàn)了一個事務(wù)范圍內(nèi)兩個相同的查詢卻返回了不同數(shù)據(jù),這就是不可重復(fù)讀。

那怎么解決可能的不可重復(fù)讀問題?Repeatable read !

Repeatable read

重復(fù)讀,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時,不再允許修改操作

事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬),當(dāng)他埋單時(事務(wù)開啟,不允許其他事務(wù)的UPDATE修改操作),收費系統(tǒng)事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉(zhuǎn)出金額了。接下來收費系統(tǒng)就可以扣款了。

分析:重復(fù)讀可以解決不可重復(fù)讀問題。寫到這里,應(yīng)該明白的一點就是,不可重復(fù)讀對應(yīng)的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應(yīng)的是插入INSERT操作,而不是UPDATE操作。

什么時候會出現(xiàn)幻讀?

事例:程序員某一天去消費,花了2千元,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事務(wù)開啟),看到確實是花了2千元,就在這個時候,程序員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,并提交。當(dāng)妻子打印程序員的消費記錄清單時(妻子事務(wù)提交),發(fā)現(xiàn)花了1.2萬元,似乎出現(xiàn)了幻覺,這就是幻讀。

那怎么解決幻讀問題?Serializable!

Serializable 序列化

Serializable 是最高的事務(wù)隔離級別,在該級別下,事務(wù)串行化順序執(zhí)行,可以避免臟讀、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級別效率低下,比較耗數(shù)據(jù)庫性能,一般不使用。


共享鎖(S鎖):如果事務(wù)T對數(shù)據(jù)A加上共享鎖后,則其他事務(wù)只能對A再加共享鎖,不能加排他鎖,直到已釋放所有共享鎖。獲準共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)。

排他鎖(X鎖):如果事務(wù)T對數(shù)據(jù)A加上排他鎖后,則其他事務(wù)不能再對A加任任何類型的鎖,直到在事務(wù)的末尾將資源上的鎖釋放為止。獲準排他鎖的事務(wù)既能讀數(shù)據(jù),又能修改數(shù)據(jù)。


數(shù)據(jù)類型

日期和時間數(shù)據(jù)類型

MySQL數(shù)據(jù)類型含義

date 3字節(jié),日期,格式:2014-09-18

time 3字節(jié),時間,格式:08:42:30

datetime 8字節(jié),日期時間,格式:2014-09-18 08:42:30

timestamp 4字節(jié),自動存儲記錄修改的時間

year 1字節(jié),年份

數(shù)值數(shù)據(jù)類型

整型

MySQL數(shù)據(jù)類型含義(有符號)

tinyint 1字節(jié),范圍(-128~127)

smallint 2字節(jié),范圍(-32768~32767)

mediumint 3字節(jié),范圍(-8388608~8388607)

int 4字節(jié),范圍(-2147483648~2147483647)

bigint 8字節(jié),范圍(+-9.22*10的18次方)

上面定義的都是有符號的,當(dāng)然了,也可以加上unsigned關(guān)鍵字,定義成無符號的類型,那么對應(yīng)的取值范圍就要翻翻了,比如:

tinyint unsigned的取值范圍為0~255。

浮點型

MySQL數(shù)據(jù)類型含義

float(m, d) 4字節(jié),單精度浮點型,m總個數(shù),d小數(shù)位

double(m, d) 8字節(jié),雙精度浮點型,m總個數(shù),d小數(shù)位

decimal(m, d)decimal是存儲為字符串的浮點數(shù)

我在MySQL中建立了一個表,有一列為float(5, 3);做了以下試驗:

1.插入123.45678,最后查詢得到的結(jié)果為99.999;

2.插入123.456,最后查詢結(jié)果為99.999;

3.插入12.34567,最后查詢結(jié)果為12.346;

所以,在使用浮點型的時候,還是要注意陷阱的,要以插入數(shù)據(jù)庫中的實際結(jié)果為準。

字符串?dāng)?shù)據(jù)類型

MySQL數(shù)據(jù)類型含義

char(n)固定長度,最多255個字符

varchar(n)可變長度,最多65535個字符

tinytext可變長度,最多255個字符

text可變長度,最多65535個字符

mediumtext可變長度,最多2的24次方-1個字符

longtext可變長度,最多2的32次方-1個字符

1.char(n)和varchar(n)中括號中n代表字符的個數(shù),并不代表字節(jié)個數(shù),所以當(dāng)使用了中文的時候(UTF8)意味著可以插入m個中文,但是實際會占用m*3個字節(jié)。

2.同時char和varchar最大的區(qū)別就在于char不管實際value都會占用n個字符的空間,而varchar只會占用實際字符應(yīng)該占用的空間+1,并且實際空間+1<=n。

3.超過char和varchar的n設(shè)置后,字符串會被截斷。

4.char的上限為255字節(jié),varchar的上限65535字節(jié),text的上限為65535。

5.char在存儲的時候會截斷尾部的空格,varchar和text不會。

6.varchar會使用1-3個字節(jié)來存儲長度,text不會。

其它類型

1.enum(“member1″, “member2″, … “member65535″)

enum數(shù)據(jù)類型就是定義了一種枚舉,最多包含65535個不同的成員。當(dāng)定義了一個enum的列時,該列的值限制為列定義中聲明的值。如果列聲明包含NULL屬性,則NULL將被認為是一個有效值,并且是默認值。如果聲明了NOT NULL,則列表的第一個成員是默認值。

2.set(“member”, “member2″, … “member64″)

set數(shù)據(jù)類型為指定一組預(yù)定義值中的零個或多個值提供了一種方法,這組值最多包括64個成員。值的選擇限制為列定義中聲明的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容