應用場景一:有一張很大的資料表,表的資料條數以億計,每條資料有乙個id進行標示,我們想要提取出一批指定id的資料(以百萬計),怎麼進行加速呢。
1.首先先將指定id的資料放入資料庫中,
」load data local infile filename into tabletablename」
其中資料放在/tmp的資料夾下,將資料表建為記憶體表,
「create table tablename ()engine = myisam」或者是記憶體表無所謂
2.我們將sql語句寫成
select * from bigtable left join smalltableon btable.id=stable.id;
這樣有用嗎?實際上觀測來說是沒有什麼用的,效率上沒有任何提公升。大部分時間消耗都在資料第一次被載入時,第一次載入的時間為20s,以後的每次查詢3s結束,由此可以看出似乎影響不大。
3.我們將大表和小表的位置調換,結果發現效果一樣,所以這個方法的優化手段究竟怎樣才有效呢?
在上面的場景中,我們做了乙個對比,結果是匪夷所思的
1.1 select count (1) from (select idfrom btable right join (select id from stable)s on stable.id =btable.id)b; 這句話執行了5分鐘
1.2 select count (1) from (select idfrom btable )b right join (select id from stable)s on s.id =b.id;
執行了2分鐘,
第二個場景,將資料庫中乙個大表的資料讀出來,一次進行處理,這裡的坑是什麼呢?
大表的資料沒辦法一次讀進記憶體,所以得分段讀。一般就是用limit m,n來完成,但是這樣並不能加快效率。因為假如limit 10000,10。前10000條資料都要丟棄,但是為了取這10條資料,就要遍歷前面的10000條資料,所以這樣是不行的。
最好的方法,給**加一列id ,設為index,或者primary key,
分段選取的時候就寫 idmin_index就可以了
因為id建了索引,所以找起來就很快了。
insert ignore 和 replace into
insert ignore 與insert into的區別就是insert ignore會忽略資料庫中已經存在 的資料,如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料。這樣就可以保留資料庫中已經存在資料,達到在間隙中插入資料的目的。
replace into 跟 insert 功能類似,不同點在於:replace into 首先嘗試插入資料到表中, 1. 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料。 2. 否則,直接插入新資料。
要注意的是:插入資料的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入資料,這將導致表中出現重複的資料。
mysql replace into 有三種形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...
插入多條資料:
conn = mysqldb.connect(host = 「localhost」, user = 「root」, passwd = 「password」, db = 「mydb」, charset=』utf8′)
cursor = conn.cursor()
sql = 「insert into mytable (created_day,name,count) values(%s,%s,%s) on duplicate key update count=count+values(count)」
args=[("2012-08-27","name1",100),("2012-08-27","name1",200),("2012-08-27","name2",300)]
try:
cursor.executemany(sql, args)
except exception as e:
print0(「執行mysql: %s 時出錯:%s」 % (sql, e))
finally:
cursor.close()
conn.commit()
conn.close()
索引:加入乙個操作頻繁讀取where column=a
不如給那一列加入索引 對嗎
alter table ****.**** add key `mtype`(`mtype`);
select count(1),left(evil_number,3),if(locate('local',model)>0,1,0) as model_0 from detect_evil_number_sum where stat_date>='20180228' and phone1_city ='北京市' and cheated_type=15 group by if(locate('local',model)>0,1,0),left(evil_number,3);
菜鳥談 mysql效能優化
預設情況下,mysql用於小規模的開發安裝,而不是生產模式。如下三個mysql效能優化設定 innodb buffer pool size 緩衝池用於存放快取資料和索引。如果只執行innodb儲存引擎,通常會將80 的記憶體分配給緩衝池。如果您正在進行非常複雜的查詢,或者有大量的併發資料庫連線,或大...
mysql 安裝 菜鳥 菜鳥也玩mysql之安裝篇
作為乙個運維工程師,或多或少都要接觸到mysql。今天我來了解一下到底什麼是mysql,它該如何安裝到我們的系統中。什麼是mysql?mysql是乙個小型關係型資料庫管理系統,它是世界上非常流行的開源資料庫。由於其體積小 速度快 總體擁有成本低,尤其是開放原始碼這一特點,許多中小型 為了降低 總體擁...
mysql 安裝 菜鳥 菜鳥也玩mysql之安裝篇
作為乙個運維工程師,或多或少都要接觸到mysql。今天我來了解一下到底什麼是mysql,它該如何安裝到我們的系統中。什麼是mysql?mysql是乙個小型關係型資料庫管理系統,它是世界上非常流行的開源資料庫。由於其體積小 速度快 總體擁有成本低,尤其是開放原始碼這一特點,許多中小型 為了降低 總體擁...