自己小結下,多多向高手學習
1、在寫統計方面的sql時,有時可將大的sql拆分。
統計的清單頁面分頁,先查主表數據,再執行簡單的sql去查其他數據。數據量大時,效果很明顯。
2.事務盡量細粒度,不用臃腫。不影響數據的情況下,盡量將業分成多個小的事務。
3.不要使用select * 無用的字段不需要,浪費io,有時表變化用*可能會出麻煩。可減少服務器硬盤臨時表生成,特別是有大字段、text/blog時。
4.查詢同字段多個值時盡量不要用or.改為用in的形式,數量大時,or會慢很多,in的數量最好不要超過10000.
select id,name from user where id=1or id =2
select id,name from user where id in(1,2)
5.查詢不同條件時有時可用uniox
select id from user where id =1 or name ='hello';//及時id和name都有創建索引,查詢執行計劃,可能此查詢走的是全部掃描
select id feom user where id=1 union
select id from user where name ='hello'
6.盡量少用負向查詢
NOT 、!=、<>、 not in 、not exists、 not in、not like
7.count時null字段不會計算,查詢時注意null的操作,查詢是否為空is null
8.分頁時
selectid,name from usre limit 100000,20 偏移量越大,越慢。
如果時按id查詢的可以改為
selectid,name from usre where id >=1 limit20 //第一頁
selectid,name from usre where id >=21 limit20//第2頁
selectid,name from usre where id >=41 limit20//第3頁
不過隻使用於能按照id排序和分頁的。而且id必須連續。一般項目都按條件查詢,此建議不實用。
id不連續時:
selectid,name from usre where id >=(selectid,nameselect id from user where limit 100000,1 10000)
9.寫where條件時,字段的類型不要用錯。a為varchar類型 a>888 和a>'888' 效率不一樣。而且索引的類型也不一樣
10.自動盡量不要用null的。null建立索引占的空間更大,復合索引是無效的。不好優化。
11.盡量不要使用計算的函數。
12.使用子表查詢時,子表的數據不能過大,量小時實用
select a.id,a,name from a join (select b.id id,b.name from b where b.id<1000000 ) asb1
on a.id =b1.id 表b有索引時會很快,子查詢生成的臨時表b1,是沒有索引隻說的。數據量大時反而會慢。
1. 邏輯查詢處理
在SQL語言中,最先被執行的是FROM操作,最後執行的是LIMIT操作。每個操作都會產生一張虛擬表,該虛擬表作為一個處理的輸入。
這些虛擬表對用戶是透明的,隻有最後一步生成的虛擬表才會傳回給用戶。
邏輯查詢處理步驟序號
(8)SELECT(9)DISTINCT
(1)FROM
(3)JOIN
(2) ON
(4)WHERE
(5)GROUP BY
(6)WITH{CUBE|ROLLUP}
(7)HAVING
(10)ORDER BY
(11)LIMIT
以下具體分析查詢處理的各個階段:
1) FROM:對FROM子句中的左表和右表執行笛卡爾積,產生虛擬表VT1。
2) ON:對虛擬表VT1應用ON篩選,隻有那些符號的行才被插入虛擬表VT2中。
3) JOIN:如果指定了OUTER JOIN(如LEFT OUTER JION、RIGHT OUTER JOIN),那麼保留表中未比對的行作為外部行添加到虛擬表VT2中,產生虛擬表VT3.
如果FROM子句包含兩個以上表,則對上一個連接生成的結果表VT3和下一個表重復執行步驟1)——步驟3),直到處理完所有表為止。
4) WHERE:對虛擬表VT3應用WHERE過濾條件,隻有符合的記錄才被插入虛擬表VT4中。
5) GROUP BY:根據GROUP BY子句中的列,對VT4中的記錄進行分組操作,產生VT5。
6) CUBE|ROLLUP: 對虛擬表VT5進行CUBE或ROLLUP操作,產生虛擬表VT6。
7) HAVING:對虛擬表VT6應用HAVING過濾器,隻有符合的記錄才被插入虛擬表VT7中。
8) SELECT: 第二次執行select操作,選擇指定的列,插入到虛擬表VT8中。
9) DISTINCT:去除重復數據,產生虛擬表VT9
10)ORDER BY: 將虛擬表VT9中的記錄按照進行排序操作,產生虛擬表VT10
11)LIMIT: 取出指定行的記錄,產生虛擬表VT11,並傳回給查詢的用戶。
******************************多實例安裝***********************************
編譯安裝單機多實例 mysql 5.5.22
1、安裝cmake 編譯工具
tar zxfv cmake-2.8.7.tar.gz
cd cmake-2.8.7
./configure --prefix=/usr/local/cmake && make && make install
2、安裝mysql
tar zxfv mysql-5.5.22.tar.gz
安裝第一個實例mysql
cd mysql-5.5.22
/usr/local/cmake/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/3306 -DMYSQL_DATADIR=/data/3306 -DWITH_INNOBASE_STORAGE_ENGINE=on -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/data/3306/mysqld.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DSYSCONFDIR=/etc/mysql/3306 && make && make install
MySQL5.5版本中,編譯的選項同樣眾多,DBA可以通過# cmake . -LH 檢視支援的參數,或者瀏覽下列頁面:http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html,檢視編譯時可指定參數的詳細描述。
截略一些常用參數如下:
CMAKE_INSTALL_PREFIX:指定MySQL程式的安裝目錄,默認/usr/local/mysql
DEFAULT_CHARSET:指定服務器默認字元集,默認latin1
DEFAULT_COLLATION:指定服務器默認的校對規則,默認latin1_general_ci
ENABLED_LOCAL_INFILE:指定是否允許本地執行LOAD DATA INFILE,默認OFF
WITH_COMMENT:指定編譯備注資訊
WITH_xxx_STORAGE_ENGINE:指定靜態編譯到mysql的存儲引擎,MyISAM,MERGE,MEMBER以及CSV四種引擎默認即被編譯至服務器,不需要特別指定。
WITHOUT_xxx_STORAGE_ENGINE:指定不編譯的存儲引擎
SYSCONFDIR:初始化參數檔案目錄
MYSQL_DATADIR:數據檔案目錄
MYSQL_TCP_PORT:服務端口號,默認3306
MYSQL_UNIX_ADDR:socket檔案路徑,默認/tmp/mysql.sock
cd /usr/local/mysql/3306
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql --datadir=/data/3306 初始化
創建PID並授權
touch /data/3306/mysql.pid
chown mysql.mysql /data/3306/mysql.pid
vim /etc/mysql/3306/my.cnf
/usr/local/mysql/3306/bin/mysqld_safe --user=mysql & 啟動mysql
安裝第二實例mysql
cd mysql-5.5.22
/usr/local/cmake/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/3307 -DMYSQL_DATADIR=/data/3307 -DWITH_INNOBASE_STORAGE_ENGINE=on -DMYSQL_TCP_PORT=3307 -DMYSQL_UNIX_ADDR=/data/3307/mysqld.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DSYSCONFDIR=/etc/mysql/3307 && make && make install
MySQL5.5版本中,編譯的選項同樣眾多,DBA可以通過# cmake . -LH 檢視支援的參數,或者瀏覽下列頁面:http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html,檢視編譯時可指定參數的詳細描述。
截略一些常用參數如下:
CMAKE_INSTALL_PREFIX:指定MySQL程式的安裝目錄,默認/usr/local/mysql
DEFAULT_CHARSET:指定服務器默認字元集,默認latin1
DEFAULT_COLLATION:指定服務器默認的校對規則,默認latin1_general_ci
ENABLED_LOCAL_INFILE:指定是否允許本地執行LOAD DATA INFILE,默認OFF
WITH_COMMENT:指定編譯備注資訊
WITH_xxx_STORAGE_ENGINE:指定靜態編譯到mysql的存儲引擎,MyISAM,MERGE,MEMBER以及CSV四種引擎默認即被編譯至服務器,不需要特別指定。
WITHOUT_xxx_STORAGE_ENGINE:指定不編譯的存儲引擎
SYSCONFDIR:初始化參數檔案目錄
MYSQL_DATADIR:數據檔案目錄
MYSQL_TCP_PORT:服務端口號,默認3306
MYSQL_UNIX_ADDR:socket檔案路徑,默認/tmp/mysql.sock
cd /usr/local/mysql/3307
chown -R mysql .
chgrp -R mysql .
vim /etc/mysql/3307/my.cnf
scripts/mysql_install_db --user=mysql --datadir=/data/3307 --basedir=/usr/local/mysql/3307 --defaults-file=/etc/mysql/3307/my.cnf 初始化
創建PID並授權
touch /data/3307/mysql.pid
chown mysql.mysql /data/3307/mysql.pid
/usr/local/mysql/3307/bin/mysqld_safe --user=mysql & 啟動mysql
******************************多實例安裝***********************************