幾面:
從事四川雅安服務(wù)器托管,服務(wù)器租用,云主機(jī),雅安服務(wù)器托管,域名申請(qǐng),CDN,網(wǎng)絡(luò)代維等服務(wù)。
硬件軟件及語(yǔ)言
硬件抗住
軟件mysql沒(méi)設(shè)置數(shù)據(jù)庫(kù)設(shè)計(jì)面等
語(yǔ)言SQL語(yǔ)句寫(xiě)
面些優(yōu)化技巧
1.查詢(xún)進(jìn)行優(yōu)化應(yīng)盡量避免全表掃描首先應(yīng)考慮 where 及 order by 涉及列建立索引
2.應(yīng)盡量避免 where 句字段進(jìn)行 null 值判斷否則導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num is nullnum設(shè)置默認(rèn)值0確保表num列沒(méi)null值查詢(xún):select id from t where num=0
3.應(yīng)盡量避免 where 句使用!=或操作符否則引擎放棄使用索引進(jìn)行全表掃描
4.應(yīng)盡量避免 where 句使用or 連接條件否則導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num=10 or num=20查詢(xún):select id from t where num=10 union all select id from t where num=20
5.in not in 要慎用否則導(dǎo)致全表掃描:select id from t where num in(1,2,3) 于連續(xù)數(shù)值能用 between 要用 in :select id from t where num between 1 and 3
6.面查詢(xún)導(dǎo)致全表掃描:select id from t where name like '李%'若要提高效率考慮全文檢索
7.
where
句使用參數(shù)導(dǎo)致全表掃描SQL運(yùn)行才解析局部變量?jī)?yōu)化程序能訪問(wèn)計(jì)劃選擇推遲運(yùn)行;必須編譯進(jìn)行選擇
編譯建立訪問(wèn)計(jì)劃變量值未知作索引選擇輸入項(xiàng)面語(yǔ)句進(jìn)行全表掃描:select id from t where num=@num改強(qiáng)制查詢(xún)使用索引:select id from t with(index(索引名)) where num=@num
8.應(yīng)盡量避免 where 句字段進(jìn)行表達(dá)式操作導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where num/2=100應(yīng)改:select id from t where num=100*2
9.應(yīng)盡量避免where句字段進(jìn)行函數(shù)操作導(dǎo)致引擎放棄使用索引進(jìn)行全表掃描:select id from t where substring(name,1,3)='abc' nameabcid
應(yīng)改:
select id from t where name like 'abc%'
10.要 where 句=左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其表達(dá)式運(yùn)算否則系統(tǒng)能確使用索引
11.使用索引字段作條件該索引復(fù)合索引必須使用該索引第字段作條件才能保證系統(tǒng)使用該索引否則該索引使用并且應(yīng)盡能讓字段順序與索引順序相致
12.要寫(xiě)些沒(méi)意義查詢(xún)需要空表結(jié)構(gòu):select col1,col2 into #t from t where 1=0
類(lèi)代碼返任何結(jié)集消耗系統(tǒng)資源應(yīng)改:
create table #t(...)
13.候用 exists 代替 in 選擇:select num from a where num in(select num from b)
用面語(yǔ)句替換:
select num from a where exists(select 1 from b where num=a.num)
14.并所索引查詢(xún)都效SQL根據(jù)表數(shù)據(jù)進(jìn)行查詢(xún)優(yōu)化索引列量數(shù)據(jù)重復(fù)SQL查詢(xún)能利用索引表字段sexmale、female幾乎各半即使sex建索引查詢(xún)效率起作用
15.
索引并越越索引固 提高相應(yīng) select 效率同降低 insert 及 update 效率 insert
或 update
能重建索引所建索引需要慎重考慮視具體情況定表索引數(shù)要超6若太則應(yīng)考慮些使用列建索引否
必要
16.
應(yīng)盡能避免更新 clustered 索引數(shù)據(jù)列 clustered
索引數(shù)據(jù)列順序表記錄物理存儲(chǔ)順序旦該列值改變導(dǎo)致整表記錄順序調(diào)整耗費(fèi)相資源若應(yīng)用系統(tǒng)需要頻繁更新
clustered 索引數(shù)據(jù)列需要考慮否應(yīng)該索引建 clustered 索引
17.盡量使用數(shù)字型字段若含數(shù)值信息字段盡量要設(shè)計(jì)字符型降低查詢(xún)連接性能并增加存儲(chǔ)銷(xiāo)引擎處理查詢(xún)連接逐比較字符串每字符于數(shù)字型言需要比較夠
18.盡能使用 varchar/nvarchar 代替 char/nchar 首先變字段存儲(chǔ)空間節(jié)省存儲(chǔ)空間其于查詢(xún)說(shuō)相較字段內(nèi)搜索效率顯要高些
19.任何都要使用 select * from t 用具體字段列表代替*要返用任何字段
20.盡量使用表變量代替臨表表變量包含量數(shù)據(jù)請(qǐng)注意索引非限(主鍵索引)
21.避免頻繁創(chuàng)建刪除臨表減少系統(tǒng)表資源消耗
22.臨表并使用適使用使某些例程更效例需要重復(fù)引用型表或用表某數(shù)據(jù)集于性事件使用導(dǎo)表
23.新建臨表性插入數(shù)據(jù)量使用 select into 代替 create table避免造量 log 提高速度;數(shù)據(jù)量緩系統(tǒng)表資源應(yīng)先create tableinsert
24.使用臨表存儲(chǔ)程務(wù)必所臨表顯式刪除先 truncate table drop table 避免系統(tǒng)表較間鎖定
25.盡量避免使用游標(biāo)游標(biāo)效率較差游標(biāo)操作數(shù)據(jù)超1萬(wàn)行應(yīng)該考慮改寫(xiě)
26.使用基于游標(biāo)或臨表前應(yīng)先尋找基于集解決案解決問(wèn)題基于集通更效
27.
與臨表游標(biāo)并使 用型數(shù)據(jù)集使用 FAST_FORWARD
游標(biāo)通要優(yōu)于其逐行處理尤其必須引用幾表才能獲所需數(shù)據(jù)結(jié)集包括合計(jì)例程通要比使用游標(biāo)執(zhí)行速度快發(fā)
間允許基于游標(biāo)基于集都嘗試看哪種效更
28.所存儲(chǔ)程觸發(fā)器始處設(shè)置 SET NOCOUNT ON 結(jié)束設(shè)置 SET NOCOUNT OFF 需執(zhí)行存儲(chǔ)程觸發(fā)器每語(yǔ)句向客戶(hù)端發(fā)送DONE_IN_PROC 消息
29.盡量避免事務(wù)操作提高系統(tǒng)并發(fā)能力
30.盡量避免向客戶(hù)端返數(shù)據(jù)量若數(shù)據(jù)量應(yīng)該考慮相應(yīng)需求否合理
8 PSR 1LS error 1LS 輸入順序錯(cuò)誤電梯停底層 DZ 作沒(méi) 1LS 信號(hào)或者 1LS 信號(hào) 1LS 關(guān)前作能
看下你的my.ini配置有沒(méi)有遺漏(看仔細(xì)點(diǎn)),我的就是第一行少了[mysql]。
確定了配置文件的問(wèn)題后,先重新卸載,cmd模式下到bin目錄走下mysqld -remove
下面就是重新安裝了再啟動(dòng)應(yīng)該就是可以了。
總的來(lái)說(shuō)就是因?yàn)榕渲梦募粚?duì),重新安裝下就行了
問(wèn)題
我們有一個(gè) SQL,用于找到?jīng)]有主鍵 / 唯一鍵的表,但是在 MySQL 5.7 上運(yùn)行特別慢,怎么辦?
實(shí)驗(yàn)
我們搭建一個(gè) MySQL 5.7 的環(huán)境,此處省略搭建步驟。
寫(xiě)個(gè)簡(jiǎn)單的腳本,制造一批帶主鍵和不帶主鍵的表:
執(zhí)行一下腳本:
現(xiàn)在執(zhí)行以下 SQL 看看效果:
...
執(zhí)行了 16.80s,感覺(jué)是非常慢了。
現(xiàn)在用一下 DBA 三板斧,看看執(zhí)行計(jì)劃:
感覺(jué)有點(diǎn)慘,由于 information_schema.columns 是元數(shù)據(jù)表,沒(méi)有必要的統(tǒng)計(jì)信息。
那我們來(lái) show warnings 看看 MySQL 改寫(xiě)后的 SQL:
我們格式化一下 SQL:
可以看到 MySQL 將
select from A where A.x not in (select x from B) //非關(guān)聯(lián)子查詢(xún)
轉(zhuǎn)換成了
select from A where not exists (select 1 from B where B.x = a.x) //關(guān)聯(lián)子查詢(xún)
如果我們自己是 MySQL,在執(zhí)行非關(guān)聯(lián)子查詢(xún)時(shí),可以使用很簡(jiǎn)單的策略:
select from A where A.x not in (select x from B where ...) //非關(guān)聯(lián)子查詢(xún):1. 掃描 B 表中的所有記錄,找到滿(mǎn)足條件的記錄,存放在臨時(shí)表 C 中,建好索引2. 掃描 A 表中的記錄,與臨時(shí)表 C 中的記錄進(jìn)行比對(duì),直接在索引里比對(duì),
而關(guān)聯(lián)子查詢(xún)就需要循環(huán)迭代:
select from A where not exists (select 1 from B where B.x = a.x and ...) //關(guān)聯(lián)子查詢(xún)掃描 A 表的每一條記錄 rA: ? ? 掃描 B 表,找到其中的第一條滿(mǎn)足 rA 條件的記錄。
顯然,關(guān)聯(lián)子查詢(xún)的掃描成本會(huì)高于非關(guān)聯(lián)子查詢(xún)。
我們希望 MySQL 能先"緩存"子查詢(xún)的結(jié)果(緩存這一步叫物化,MATERIALIZATION),但MySQL 認(rèn)為不緩存更快,我們就需要給予 MySQL 一定指導(dǎo)。
...
可以看到執(zhí)行時(shí)間變成了 0.67s。
整理
我們?cè)\斷的關(guān)鍵點(diǎn)如下:
\1. 對(duì)于 information_schema 中的元數(shù)據(jù)表,執(zhí)行計(jì)劃不能提供有效信息。
\2. 通過(guò)查看 MySQL 改寫(xiě)后的 SQL,我們猜測(cè)了優(yōu)化器發(fā)生了誤判。
\3. 我們?cè)黾恿?hint,指導(dǎo) MySQL 正確進(jìn)行優(yōu)化判斷。
但目前我們的實(shí)驗(yàn)僅限于猜測(cè),猜中了萬(wàn)事大吉,猜不中就無(wú)法做出好的診斷。
show full processlist; -- 查詢(xún)?nèi)慨?dāng)前進(jìn)程;
show processlist;-- 只列出前100條
kill 99; -- 99為卡死id
show status;