EQUI JOIN: join、outer join
SEMI JOIN: from a,b
一顷级、索引
//存儲過程至批量數(shù)據(jù)導(dǎo)入
create PROCEDURE bigData_test(IN num int,IN begin_num int)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE y INT DEFAULT begin_num;
WHILE i < num DO
INSERT INTO bs_user VALUES (y,concat(y,'.jpg'),concat('tangyb',y),concat('tangyb',y),concat('tangyb',y),NULL,NULL,'00');
SET i = i + 1;
SET y = y + 1;
END WHILE;
END
//執(zhí)行存儲函數(shù)
START TRANSACTION;
call bigData_test(100000,1); /*調(diào)用存儲過程(手動開啟事務(wù)愕把,否則每次insert都會commit森爽,會導(dǎo)致執(zhí)行速度慢到令人發(fā)指)
commit;
//新建并查詢索引(自己測試的時(shí)候先新增數(shù)據(jù)在建立索引,否則在添加數(shù)據(jù)的時(shí)候等候時(shí)間太長)
ALTER TABLE bs_user ADD INDEX index_uname (u_name); /給bs_user添加一個(gè)名為index_uname的索引
show index from bs_user; /查詢bs_user表中的索引
小知識
show global variables like '%query_cache%'; /查詢query_cache 是否開啟(走索引第一次會很慢爬迟,第二次會很快)
show variables like '%storage_engine%'; /表引擎使用innodb.第一次查詢也會走數(shù)據(jù)文件付呕,第二次直接走buffer_pool,也比直接查詢數(shù)據(jù)文件要快
原理分析:http://blog.jobbole.com/24006/
二、分表徽职、分庫、分區(qū)
在大數(shù)據(jù)的基礎(chǔ)上需要考慮這些數(shù)據(jù)主要是讀還是更新(根據(jù)不同的操作也可以選擇不同特征的數(shù)據(jù)庫说订,冷熱數(shù)據(jù)分離)
分表:垂直-按照字段(如:文章的內(nèi)容常常用于查詢潮瓶,訪問量常常更新)
水平-保持表的結(jié)構(gòu)相同,只是把數(shù)據(jù)放到不同的表中(user表:user1,user2)埂伦,根據(jù)uid段來區(qū)分11000000放到user1思恐,10000012000000放到user2等等
每張表都需要帶上膊毁,MYD數(shù)據(jù)文件类早,.MYI索引文件,.frm表結(jié)構(gòu)文件
分區(qū):將一張表的數(shù)據(jù)分為N個(gè)區(qū)塊缭召,可以放置在相同或是不同的磁盤上逆日,散列在不同的位置。操作的同一張表名室抽,由數(shù)據(jù)庫自己選擇分區(qū)
分庫:當(dāng)一臺服務(wù)器的磁盤IO遇到瓶頸或是磁盤剩余空間過小等等,可以采用分庫到不同服務(wù)器數(shù)據(jù)庫
簡單介紹:http://www.cnblogs.com/langtianya/p/4997768.html
存在問題:http://wentao365.iteye.com/blog/1740874
一種是表鎖定(myisam存儲引擎)晓折,一個(gè)是行鎖定(innodb存儲引擎)
mysql大約執(zhí)行流程
1兽泄、接收到sql;
2、把sql放到排隊(duì)隊(duì)列中;
3胃珍、執(zhí)行sql;
4蜓陌、返回執(zhí)行結(jié)果。
分表
a填抬,做mysql集群隧期,用調(diào)度算法選擇數(shù)據(jù)庫(但是每張表的數(shù)據(jù)還是那么多,只是改變了連接隊(duì)列方面的效率厌秒,而且耗硬件)
b,預(yù)計(jì)會出現(xiàn)大數(shù)據(jù)量并訪問頻繁檐晕,按照user1,user2的方式分表(縮短每張表的數(shù)據(jù),但是前期如果沒有規(guī)劃好个榕,后期就需要修改大量的sql)
c芥喇,merge存儲引擎來實(shí)現(xiàn)分表(用一個(gè)總表allUser,然后做user1和User2),具體http://www.cnblogs.com/miketwais/articles/mysql_partition.html
1,存儲引擎的使用不同,冷數(shù)據(jù)使用MyIsam 可以有更好的查詢數(shù)據(jù)械馆∥渫ǎ活躍數(shù)據(jù)癞谒,可以使用Innodb ,可以有更好的更新速度扒磁。
2,對冷數(shù)據(jù)進(jìn)行更多的從庫配置,因?yàn)楦嗟牟僮魇遣樵兦羟梗@樣來加快查詢速度。對熱數(shù)據(jù)默赂,可以相對有更多的主庫的橫向分表處理忆植。
3,對于一些特殊的活躍數(shù)據(jù)谒臼,也可以考慮使用memcache ,redis之類的緩存,等累計(jì)到一定量再去更新數(shù)據(jù)庫.
三拾氓、引擎
mysql中 myisam 引擎不支持事務(wù)的概念底哥,多用于數(shù)據(jù)倉庫這樣查詢多而事務(wù)少的情況,速度較快趾徽。
mysql中 innoDB 引擎支持事務(wù)的概念孵奶,多用于web網(wǎng)站后臺等實(shí)時(shí)的中小型事務(wù)處理后臺。
四、優(yōu)化
//檢索速度的提升
1湿颅、like '%tangyb' 這種前面模糊匹配會嚴(yán)重影響檢索速度
2粥诫、limit 的offset 是取offset+N行 并不是從offset開始,所以offset特別大的時(shí)候 影響效率
3、count()會統(tǒng)計(jì)所有行 谊囚,count(1)必須確保第一列不為null揉稚,否則不會統(tǒng)計(jì),所以mysql推薦使用count()
4搀玖、禁止使用外鍵(不適合分布式灌诅、高并發(fā))和存儲過程(不利于調(diào)試、擴(kuò)展猜拾、移植)
5、最好避免in的使用顽聂,最好在1000以內(nèi)
6盯仪、mybatis多用resultMap,禁止返回resultClass,減少耦合耀石,方便維護(hù)
7爸黄、表的設(shè)計(jì) 包括 id、gmt?_creat炕贵、gmt?_modified