數據庫查詢優化的思路:
1:優化sql
2:添加索引
3:加緩存,如memcached
4:主從復制或主主復制,讀寫分離
5:分區
6:垂直切分
垂直切分就是要把表按模塊劃分到不同數據庫中,這類拆分在大型網站的演化進程中是很常見的。當1個網站還在很小的時候,只有小量的人來開發和保護,各模塊和表都在1起,當網站不斷豐富和壯大的時候,也會變成多個子系統來支持,這時候就有按模塊和功能把表劃分出來的需求。
7:水平切分
上面談到垂直切分只是把表按模塊劃分到不同數據庫,但沒有解決單表大數據量的問題,而水平切分就是要把1個表依照某種規則把數據劃分到不同表或數據庫里。例如像計費系統,通過按時間來劃分表就比較適合,由于系統都是處理某1時間段的數據。而像SaaS利用,通過按用戶維度來劃分數據比較適合,由于用戶與用戶之間的隔離的,1般不存在處理多個用戶數據的情況
接下來溫習幾個簡單的SQL文
1:count(expr)
count(column) 和 count(*) 是1個完全不1樣的操作,所代表的意義也完全不1樣
count(column) 是表示結果集中有多少個column字段不為空的記錄
count(*) 是表示全部結果集有多少條記錄
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:當只要1行數據時使用limit 1
MySQL數據庫引擎會在找到1條數據后停止搜索,而不是繼續往后查找下1條符合記錄的數據。
SELECT * FROM book WHERE isbn = ‘1464540496384’; //0.060s
SELECT * FROM book WHERE isbn = ‘1464540496384’ limit 1; //0.024s
3、避免SELECT *
從數據庫里讀出越多的數據,那末查詢就會變得越慢。并且,如果你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增加網絡傳輸的負載。所以,你應當養成1個需要甚么就取甚么的好的習慣。
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