定期分析表,
檢查表,
優化表:
analyze [local | no_write_to_binlog] table table_name [,table_name1] ;
本語句用於分析和儲存表的關鍵字分布,執行一次分析表,在分析期間使用乙個讀取鎖定。這對於myisam,bdb
和innodb
表有作用,對於
myisam
本語句相當於
myisamchk -a .
分析表:
mysql> analyze table xz_article;
檢查表的語法
check
table table_name [,table_name1] [option] .....
option=
檢查表主要是檢查乙個或多個表是否有錯誤。check table
對myisam
和innodb
表有作用。
檢查表:
mysql> check table xz_article;
優化表語法
optimize [local | no_write_to_binlog] table table_name [,table_name1] .. ;
如果已經刪除了表的一大部分,或者對可變列(varchar,blob
或text)
進行了大修改,則需要使用
optimize
優化,這個命令可以將表中的空間碎片進行合併,並且可以消除由刪除或更新造成的空間浪費。但
optimize
命令只對
myisam,bdb,innodb
表有用。
注:analyze,check,optimize
在執行期間會自動將表鎖定,因此一定要在資料庫不繁忙的時候執行操作。
常用的sql
的優化前面記錄的都是與查詢有關的優化,現在主要記錄其他一些insert,group by
等sql
語句的優化。
1.大批量插入資料
使用load
命令匯入資料
mysql> load data infile 'data.txt' into table db.my_table;
disable keys
和 enable keys
用來開啟和關閉myisam
表非唯一索引的更新,在匯入大量資料到乙個非空的
myisam
表時,通過這
2個命令可以提高匯入效率。
正確的匯入方法是(
只對myisam
有效):
1.先關閉
keys: alter table
my_table disable keys ;
2.匯入資料
: load data infile 'data.txt' into table db.my_table;
3.開啟
keys: alter table my_table enable keys ;
對於innodb
匯入大量資料時,因為
innodb
型別是按主鍵順序儲存的,所以有以下幾種方法提高效率:
1.當匯入的檔案資料按主鍵順序儲存的時候比不按主鍵順序儲存的效率高。
2.在匯入前執行set unique_checks = 0
關閉唯一性校驗,匯入結束後執行
set unique_checks = 1
恢復唯一校驗。
3.在匯入前可以執行
set autocommit = 0
關閉自動提交,匯入結束後開啟
set autocommit = 1 。
優化insert
語句優化group by
語句因為使用group by
分組後會自動進行排序,所以在使用
order by
也就沒什麼意義了,如果不需要排序造成的消耗,可以使用
order by null
解決。如:
explain select * from table group by col1 order by null\g;
結論是如果不加order by null,extra
則是using filesoft
,加了則是
using temporary
。(filesoft
檔案排序是最耗費時間的)
優化order by
語句有以下幾種情況不能使用索引:
1.select * from table order by col1 desc,col2 asc ;
order by
字段混合了
desc
和asc
2.select * from table where col1 = constant order by col2;
用於查詢的關鍵字和order by
中使用的不同
3.select * from table order by col1,col2 ;
對不同的關鍵字使用order by
優化巢狀查詢
一般使用join
來代替子查詢
mysql優化
or條件
對於含有or
的查詢子句,如果要利用索引,則
or之間的每個條件必須都要使用到索引。
使用sql
提示use index:
在查詢語句表面後面新增use index
來提供希望
mysql
去參考的索引列表,就可以讓
mysql
不再考慮其他可用的索引。
如:explain select * from table use index (ind_email) where email = '[email protected]' \g ;
ignore index:
在查詢的時候可以讓mysql
忽略索引,用法同
use index。如:
explain select * from table ignore index(ind_email) where email =
\g;
force index:在查詢時,可以強制mysql
使用某個索引進行掃瞄。
如:explain select * from table where id > 0 \g ;
因為條件是
id > 0
,所以不會執行索引,但是我們可以用
force index
強制加上索引,用法如上。
SQL優化常用方法18
用exists替代in 在許多基於基礎表的查詢中,為了滿足乙個條件,往往需要對另乙個表進行聯接.在這種情況下,使用exists 或not exists 通常將提高查詢的效率.低效 select from emp 基礎表 where empno 0 and deptno in select deptn...
1 8(SQL學習筆記)觸發器
一 觸發器簡介 當需要某些操作在某些語句執行之前或之後執行就需要使用觸發器。例如每次插入資料時進行資料校對,每次刪除資料後將刪除內容備份到新錶。這些操作我們希望它 某些語句 在滿足某些條件時自動執行,也可以稱為這些條件觸發了這些操作。既然某些操作可以觸發某些操作,那麼關鍵要定義兩點 1.觸發條件。2...
查詢優化 SQL優化
查詢優化注意點 代表查詢速度比較 1 所有查詢必須注意 的使用必要性 cout 1 cout 2 字段 主鍵索引 字段 普通索引 字段 沒有索引 3 乙個字段 多個字段 欄位多越慢 4 大於10000和大於10001的區別 後者大於前者 5 列沒別名 列 有別名6 兩個條件,where時應該將符合資...