數(shù)據(jù)庫查詢優(yōu)化的思路:
1:優(yōu)化sql
2:添加索引
3:加緩存,如memcached
4:主從復(fù)制或主主復(fù)制,讀寫分離
5:分區(qū)
6:垂直切分
垂直切分就是要把表按模塊劃分到不同數(shù)據(jù)庫中,這類拆分在大型網(wǎng)站的演化進程中是很常見的。當(dāng)1個網(wǎng)站還在很小的時候,只有小量的人來開發(fā)和保護,各模塊和表都在1起,當(dāng)網(wǎng)站不斷豐富和壯大的時候,也會變成多個子系統(tǒng)來支持,這時候就有按模塊和功能把表劃分出來的需求。
7:水平切分
上面談到垂直切分只是把表按模塊劃分到不同數(shù)據(jù)庫,但沒有解決單表大數(shù)據(jù)量的問題,而水平切分就是要把1個表依照某種規(guī)則把數(shù)據(jù)劃分到不同表或數(shù)據(jù)庫里。例如像計費系統(tǒng),通過按時間來劃分表就比較適合,由于系統(tǒng)都是處理某1時間段的數(shù)據(jù)。而像SaaS利用,通過按用戶維度來劃分數(shù)據(jù)比較適合,由于用戶與用戶之間的隔離的,1般不存在處理多個用戶數(shù)據(jù)的情況
接下來溫習(xí)幾個簡單的SQL文
1:count(expr)
count(column) 和 count(*) 是1個完全不1樣的操作,所代表的意義也完全不1樣
count(column) 是表示結(jié)果集中有多少個column字段不為空的記錄
count(*) 是表示全部結(jié)果集有多少條記錄
2:字符串拼接
(1)SELECT * FROM book WHERE isbn = ‘1464540496384’
(2)SELECT * FROM book WHERE isbn = CONCAT(‘146454049638’,’4’)
(3)SELECT * FROM book WHERE isbn = (‘146454049638’+’4’)
第1個sql跟第2個sql是相同的效果。
SELECT (‘146454049638’+’4’) from DUAL //146454049642
2:當(dāng)只要1行數(shù)據(jù)時使用limit 1
MySQL數(shù)據(jù)庫引擎會在找到1條數(shù)據(jù)后停止搜索,而不是繼續(xù)往后查找下1條符合記錄的數(shù)據(jù)。
SELECT * FROM book WHERE isbn = ‘1464540496384’; //0.060s
SELECT * FROM book WHERE isbn = ‘1464540496384’ limit 1; //0.024s
3、避免SELECT *
從數(shù)據(jù)庫里讀出越多的數(shù)據(jù),那末查詢就會變得越慢。并且,如果你的數(shù)據(jù)庫服務(wù)器和WEB服務(wù)器是兩臺獨立的服務(wù)器的話,這還會增加網(wǎng)絡(luò)傳輸?shù)呢撦d。所以,你應(yīng)當(dāng)養(yǎng)成1個需要甚么就取甚么的好的習(xí)慣。
SELECT id,Name from book; //0.090s
SELECT * from book; //0.145s
4.批量插入效力高于逐條插入
insert into book (NAME,AUTHOR,CATEGORY_ID,ISBN) VALUES(‘java’,’tom’,2,’123456’); //0.074
insert into book (NAME,AUTHOR,CATEGORY_ID,ISBN) VALUES(‘javascript’,’lili’,2,’7891011’); //0.076
insert into book (NAME,AUTHOR,CATEGORY_ID,ISBN) VALUES(‘c++’,’lulu’,4,’789234’); //0.067
insert into book (NAME,AUTHOR,CATEGORY_ID,ISBN) VALUES(‘java’,’tom’,2,’123456’),
(‘javascript’,’lili’,2,’7891011’),
(‘c++’,’lulu’,4,’789234’); //0.065