-
不要用select *
反例:
select * from app.user_model
正例:
select login_id,name,sex from app.user_model
理由:
只查詢需要的字段可以減少磁盤io和網(wǎng)絡(luò)io局雄,提升查詢性能
-
不要在大結(jié)果集上構(gòu)造虛擬列
反例:
select id ,pv, uv , pv/uv rate from app.scene_model
正例:
select id ,pv, uv from app.scene_model
理由:
虛擬列非常消耗資源浪費(fèi)性能它褪,拿到pv uv后在前端顯示時(shí)構(gòu)造比率监嗜。
-
不要在唯一列或大基數(shù)列上進(jìn)行分組或去重操作
反例:
select id, count(1) cn from app.user_model group by id
正例:
select id from app.user_model
理由:
基數(shù)太大會(huì)消耗過多的io和內(nèi)存畜份。
-
根據(jù)需要查詢指定范圍的數(shù)據(jù) (where)
反例:
select login_id,name,sex from app.user_model
正例:
select login_id,name,sex from app.user_model where create_time>'2020-03-30'
理由:
減少磁盤io和網(wǎng)絡(luò)io胧华,提升查詢性能
-
關(guān)聯(lián)查詢時(shí)小表在后(大表 join 小表)
反例:
select login_id,name,sex,a.scene_name from app.scene_model a join app.user_model b on a.create_user=b.id
正例:
select login_id,name,sex,a.scene_name from app.user_model a join app.scene_model b on a.id=b.create_user
理由:
無論是Left Join 、Right Join還是Inner Join永遠(yuǎn)都是拿著右表中的每一條記錄到左表中查找該記錄是否存在
-
使用 uniqCombined 替代 distinct
反例:
SELECT count( DISTINCT create_user ) from app.scene_model
正例:
SELECT uniqCombined( create_user ) from app.scene_model
理由:
uniqCombined對(duì)去重進(jìn)行了優(yōu)化绣硝,通過近似去重提升十倍查詢性能
-
通過使用 limit 限制返回?cái)?shù)據(jù)條數(shù)
反例:
select id,scene_name,code,pv from app.scene_model order by pv desc
正例:
select id,scene_name,code,pv from app.scene_model order by pv desc limit 100
理由:
使用limit返回指定的結(jié)果集數(shù)量蜻势,不會(huì)進(jìn)行向下掃描撑刺,大大提升了查詢效率
-
盡量不去使用字符串類型
反例:
CREATE TABLE scene_model
(
id String,
scene_name String,
pv String,
create_time String
)
ENGINE = <Engine>
...
正例:
CREATE TABLE scene_model
(
id String,
scene_name String,
pv Int32,
create_time Date
)
ENGINE = <Engine>
...
理由:
時(shí)間類型最終會(huì)轉(zhuǎn)換成數(shù)值類型進(jìn)行處理,數(shù)值類型在執(zhí)行效率和存儲(chǔ)上遠(yuǎn)好過字符串
-
指定查詢分區(qū)獲取必要的數(shù)據(jù)
假設(shè)分區(qū)字段是day
反例:
select type,count(1) from app.user_model group by type
正例:
select type,count(1) from app.user_model where day ='2020-03-30' group by type
理由:
通過指定分區(qū)字段會(huì)減少底層數(shù)據(jù)庫掃描的文件數(shù)量握玛,提升查詢性能
-
分組前過濾不必要的字段
反例:
select type,count(1) from app.user_model group by type
正例:
select type,count(1) from app.user_model where type ='1' or type ='2' group by type
理由:
通過限制分組前結(jié)果集數(shù)量够傍,查詢性能一般能提示數(shù)十倍甫菠,甚至上百倍