馬桶Java :6.高性能MySQL語句(一)

馬桶??Java 上廁所就能看完的小知識! 歡迎關(guān)注惠豺、點(diǎn)贊 持續(xù)更新风宁!
以下文章整理自公眾號 :撿田螺的小男孩
并結(jié)合自己學(xué)習(xí)的一些規(guī)范整理而出蛹疯。當(dāng)然這只是建議因?yàn)樽髡哂X得可以提高性能
每一條建議都提供了具體實(shí)例,歡迎指正和學(xué)習(xí)哦

1. 查詢盡量不要使用SELECT *饮寞,而是SELECT具體字段

反例:

select * from employee;

正例:

select id幽崩,name from employee;

原因:

  1. 只取需要的字段,節(jié)省資源陌选、減少網(wǎng)絡(luò)開銷蹄溉。(因?yàn)椴樵兂鲂枰侄危揖W(wǎng)絡(luò)傳輸前后端也只傳輸需要字段役电,減少了不需要字段的開銷)
  2. select * 進(jìn)行查詢時(shí)棉胀,很可能就不會(huì)使用到覆蓋索引了,就會(huì)造成回表查詢瓢谢。什么是回表驮瞧?(不需要購買課程簡介足夠理解)

2.如果知道查詢結(jié)果只有一條或者只要最大/最小一條記錄论笔,建議用LIMIT 1

假設(shè)現(xiàn)在有employee員工表,要找出一個(gè)名字叫jay的人.

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `sex` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

反例:

select id蒜埋,name from employee where name='jay'

正例:

select id整份,name from employee where name='jay' limit 1;

原因:

  1. 加上limit 1后,只要找到了對應(yīng)的一條記錄,就不會(huì)繼續(xù)向下掃描了,效率將會(huì)大大提高籽孙。
  2. 如果name是唯一索引的話,是不必要加上limit 1了讲冠,因?yàn)閘imit的存在主要就是為了防止全表掃描适瓦,從而提高性能,如果一個(gè)語句本身可以預(yù)知不用全表掃描谱仪,有沒有l(wèi)imit 疯攒,性能的差別并不大列荔。

3.應(yīng)盡量避免在where子句中使用or來連接條件

新建一個(gè)user表,它有一個(gè)普通索引userId筷转,表結(jié)構(gòu)如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `age` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

假設(shè)現(xiàn)在需要查詢userid為1或者年齡為18歲的用戶呜舒,很容易有以下sql

反例:

select * from user where userid=1 or age =18

正例:

-- 使用union all
select * from user where userid=1 
union all 
select * from user where age = 18

原因:

  1. 使用or可能會(huì)使索引失效笨奠,從而全表掃描。
  2. 對于or+沒有索引的age這種情況般婆,假設(shè)它走了userId的索引到腥,但是走到age查詢條件時(shí),它還得全表掃描蔚袍,也就是需要三步過程:全表掃描+索引掃描+合并 如果它一開始就走全表掃描乡范,直接一遍掃描就完事。mysql是有優(yōu)化器的啤咽,處于效率與成本考慮晋辆,遇到or條件,索引可能失效宇整,看起來也合情合理瓶佳。

4. 優(yōu)化limit分頁

我們?nèi)粘W龇猪撔枨髸r(shí),一般會(huì)用 limit 實(shí)現(xiàn)鳞青,但是當(dāng)偏移量特別大的時(shí)候,查詢效率就變得低下臂拓。

反例:

select id厚脉,name,age from employee limit 10000埃儿,10

正例:

-- 方案一 :返回上次查詢的最大記錄(偏移量) 通過索引是唯一且自增的
select id器仗,name from employee where id>10000 limit 10.
-- 方案二:order by + 索引
select id融涣,name from employee order by id  limit 10000童番,10

原因:

  1. 當(dāng)偏移量最大的時(shí)候精钮,查詢效率就會(huì)越低,因?yàn)镸ysql并非是跳過偏移量直接去取后面的數(shù)據(jù)剃斧,而是先把偏移量+要取的條數(shù)轨香,然后再把前面偏移量這一段的數(shù)據(jù)拋棄掉再返回的。
  2. 如果使用優(yōu)化方案一幼东,返回上次最大查詢記錄(偏移量)臂容,這樣可以跳過偏移量,效率提升不少根蟹。
  3. 方案二使用order by+索引脓杉,也是可以提高查詢效率的。

5. 優(yōu)化你的like語句

日常開發(fā)中简逮,如果用到模糊關(guān)鍵字查詢球散,很容易想到like,但是like很可能讓你的索引失效散庶。

反例:

select userId蕉堰,name from user where userId like '%123';

正例:

select userId,name from user where userId like '123%';

原因:
(explain 查詢結(jié)果狀態(tài))

把%放前面悲龟,并不走索引屋讶,

如圖所示

把% 放關(guān)鍵字后面,還是會(huì)走索引的

img
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末须教,一起剝皮案震驚了整個(gè)濱河市皿渗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轻腺,老刑警劉巖羹奉,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異约计,居然都是意外死亡诀拭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門煤蚌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耕挨,“玉大人,你說我怎么就攤上這事尉桩⊥舱迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵蜘犁,是天一觀的道長翰苫。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么奏窑? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任导披,我火速辦了婚禮,結(jié)果婚禮上埃唯,老公的妹妹穿的比我還像新娘撩匕。我一直安慰自己,他們只是感情好墨叛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布止毕。 她就那樣靜靜地躺著,像睡著了一般漠趁。 火紅的嫁衣襯著肌膚如雪扁凛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天闯传,我揣著相機(jī)與錄音令漂,去河邊找鬼。 笑死丸边,一個(gè)胖子當(dāng)著我的面吹牛叠必,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妹窖,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纬朝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骄呼?” 一聲冷哼從身側(cè)響起共苛,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜓萄,沒想到半個(gè)月后隅茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉沽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年辟犀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绸硕。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堂竟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玻佩,到底是詐尸還是另有隱情出嘹,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布咬崔,位于F島的核電站税稼,受9級特大地震影響烦秩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郎仆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一只祠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丸升,春花似錦铆农、人聲如沸牺氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猴凹。三九已至夷狰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郊霎,已是汗流浹背沼头。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书劝,地道東北人进倍。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像购对,于是被迫代替她去往敵國和親猾昆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容