{eval=Array;=+count(Array);}
1. 避免使用 select * 你需要什么信息,就查詢什么信息,查詢的多了,查詢的速度肯定就會(huì)慢
2. 當(dāng)你只需要查詢出一條數(shù)據(jù)的時(shí)候,要使用 limit 1 比如你要查詢數(shù)據(jù)中是否有男生,只要查詢一條含有男生的記錄就行了,后面不需要再查了,使用Limit 1 可以在找到一條數(shù)據(jù)后停止搜索
3. 建立高性能的索引 索引不是隨便加的也不是索引越多越好,更不是所有索引對(duì)查詢都有效
4. 建數(shù)據(jù)庫(kù)表時(shí),給字段設(shè)置固定合適的大小. 字段不能設(shè)置的太大,設(shè)置太大就造成浪費(fèi),會(huì)使查詢速度變慢
5. 要盡量使用not null
6. EXPLAIN 你的 SELECT 查詢 使用EXPLAIN,可以幫助你更了解MySQL是如何處理你的sql語(yǔ)句的, 你可以查看到sql的執(zhí)行計(jì)劃,這樣你就能更好的去了解你的sql語(yǔ)句的不足,然后優(yōu)化語(yǔ)句.
7. 在Join表的時(shí)候,被用來(lái)Join的字段,應(yīng)該是相同的類型的,且字段應(yīng)該是被建過(guò)索引的,這樣,MySQL內(nèi)部會(huì)啟動(dòng)為你優(yōu)化Join的SQL語(yǔ)句的機(jī)制。
8. 如果你有一個(gè)字段,比如“性別”,“國(guó)家”,“民族”, “省份”,“狀態(tài)”或“部門”,這些字段的取值是有限而且固定的,那么,應(yīng)該使用 ENUM 而不是 VARCHAR。
因?yàn)樵贛ySQL中,ENUM類型被當(dāng)作數(shù)值型數(shù)據(jù)來(lái)處理,而數(shù)值型數(shù)據(jù)被處理起來(lái)的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫(kù)的性能。
9. 垂直分割 將常用和有關(guān)系的字段放在相同的表中,把一張表的數(shù)據(jù)分成幾張表 這樣可以降低表的復(fù)雜度和字段的數(shù)目,從而達(dá)到優(yōu)化的目的
10. 優(yōu)化where查詢
①. 避免在where子句中對(duì)字段進(jìn)行表達(dá)式操作
比如: select 列 from 表 where age*2=36; 建議改成 select 列 from 表 where age=36/2;
②. 應(yīng)盡量避免在 where 子句中使用 !=或 操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
③. 應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值 判斷
④. 應(yīng)盡量避免在 where 子句中使用 or 來(lái)連接條件
11. 不建議使用%前綴模糊查詢,這種查詢會(huì)導(dǎo)致索引失效而進(jìn)行全表掃描
例如LIKE “%name”或者LIKE “%name%這兩種都是不建議的.但是可以使用LIKE “name%”。
對(duì)于LIKE “%name%,可以使用全文索引的形式
12. 要慎用in和 not in
例如:select id from t where num in(1,2,3) 建議改成 select id from t where num between 1 and 3
對(duì)于連續(xù)的數(shù)值,能用 between 就不要用 in 了
13. 理解in和exists, not in和not exists的區(qū)別
很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇:如查詢語(yǔ)句使用了not in那么內(nèi)外表都進(jìn)行全表掃描,沒(méi)用到索引,而not exists子查詢依然能用到表上索引,所以無(wú)論哪個(gè)表大,用not exists都比not in要快。
select num from a where num in(select num from b)
建議改成: select num from a where exists(select 1 from b where num=a.num)
區(qū)分in和exists主要是造成了驅(qū)動(dòng)順序的改變(這是性能變化的關(guān)鍵),如果是exists,那么以外層表為驅(qū)動(dòng)表,先被訪問(wèn),如果是IN,那么先執(zhí)行子查詢。所以IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。
關(guān)于not in和not exists,推薦使用not exists,不僅僅是效率問(wèn)題,not in可能存在邏輯問(wèn)題
14. 理解select Count (*)和Select Count(1)以及Select Count(column)區(qū)別
一般情況下,Select Count (*)和Select Count(1)兩著返回結(jié)果是一樣的
假如表沒(méi)有主鍵(Primary key), 那么count(1)比count(*)快,
如果有主鍵的話,那主鍵作為count的條件時(shí)候count(主鍵)最快
如果你的表只有一個(gè)字段的話那count(*)就是最快的
count(*) 跟 count(1) 的結(jié)果一樣,都包括對(duì)NULL的統(tǒng)計(jì),而count(column) 是不包括NULL的統(tǒng)計(jì)
技術(shù)交流請(qǐng)關(guān)注“大數(shù)據(jù)java架構(gòu)師”
我認(rèn)為可以大致從一下幾個(gè)方面考慮:
1、表結(jié)構(gòu)優(yōu)化。
根據(jù)當(dāng)前和未來(lái)可能擴(kuò)展的業(yè)務(wù)需求,合理設(shè)計(jì)表結(jié)構(gòu),合理拆分或合并,減少數(shù)據(jù)冗余。
2、索引優(yōu)化。
根據(jù)數(shù)據(jù)庫(kù)各個(gè)表的查詢業(yè)務(wù)設(shè)計(jì)合理的查詢索引??梢詤⒖?《數(shù)據(jù)庫(kù)索引設(shè)計(jì)與優(yōu)化》一書(shū)。優(yōu)化系統(tǒng)存在的慢查詢,分析原因,對(duì)癥下藥。
3、考慮讀寫讀寫分離,小型數(shù)據(jù)庫(kù)集群構(gòu)建。或者查分相關(guān)業(yè)務(wù)到其他數(shù)據(jù)庫(kù),比如redis, ES等。
你問(wèn)的太籠統(tǒng)了,想優(yōu)化什么?是優(yōu)化效率嗎?這個(gè)需要認(rèn)真分析,到底是你程序邏輯需要優(yōu)化,還是數(shù)據(jù)庫(kù)設(shè)計(jì)。這些都會(huì)造成數(shù)據(jù)庫(kù)訪問(wèn)變慢。
MySQL作為輕量級(jí)的互聯(lián)網(wǎng)數(shù)據(jù)庫(kù)先進(jìn)代表以后應(yīng)該往企業(yè)級(jí)應(yīng)用領(lǐng)域發(fā)展。如ORACLE和SQLSERVER數(shù)據(jù)庫(kù)系統(tǒng)那樣除了擁有自己強(qiáng)大的核心數(shù)據(jù)庫(kù)存儲(chǔ)技術(shù)之外,還應(yīng)該在索引,并發(fā),安全和分布式領(lǐng)域拓展發(fā)展,能做成如ORACLE ERP企業(yè)級(jí)應(yīng)用需要的集成開(kāi)發(fā)工具,能實(shí)現(xiàn)SQLSERVER數(shù)據(jù)庫(kù)的虛擬化系統(tǒng)需要,從而能更好地支持PHP,C++,DELPHI和JAVA等開(kāi)發(fā)語(yǔ)言的多種實(shí)際應(yīng)用。
我們知道,MySQL 一直依賴對(duì) count(*) 的執(zhí)行很頭疼。很早的時(shí)候,MyISAM 引擎自帶計(jì)數(shù)器,可以秒回;不過(guò) InnoDB 就需要實(shí)時(shí)計(jì)算,所以很頭疼。以前有多方法可以變相解決此類問(wèn)題,比如:1. 模擬 MyISAM 的計(jì)數(shù)器比如表 ytt1,要獲得總數(shù),我們建立兩個(gè)觸發(fā)器分別對(duì) insert/delete 來(lái)做記錄到表 ytt1_count,這樣只需要查詢表 ytt1_count 就能拿到總數(shù)。ytt1_count 這張表足夠小,可以長(zhǎng)期固化到內(nèi)存里。不過(guò)缺點(diǎn)就是有多余的觸發(fā)器針對(duì) ytt1 的每行操作,寫性能降低。這里需要權(quán)衡。
2. 用 MySQL 自帶的 sql_calc_found_rows 特性來(lái)隱式計(jì)算
依然是表 ytt1,不過(guò)每次查詢的時(shí)候用 sql_calc_found_rows 和 found_rows() 來(lái)獲取總數(shù),比如:
安裝的時(shí)候有設(shè)置模板,可以搜索知數(shù)堂,然后根據(jù)你服務(wù)器配置進(jìn)行少量調(diào)整,主要還是頭發(fā)數(shù)/INNODB相關(guān)緩存設(shè)置,這是基本優(yōu)化;到了業(yè)務(wù)方面,就只能根據(jù)相關(guān)范式進(jìn)行優(yōu)化了;另外linux的優(yōu)化也要做,只是這部分是通用的,不是只為mysql做優(yōu)化
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答