MySQL海量資料單一字段更新

2021-09-24 01:33:47 字數 2171 閱讀 5210

昨天發了一篇mysql中索引對千萬級資料查詢效率優化實踐的博文

所以手上有著5000萬的資料,很多以前想做的實驗也有機會去嘗試了。今天上課突然想起來一篇資料庫的面試題。

大概是說:某公司有一張億級的使用者表,使用者表有乙個積分字段。這個欄位會在每年新年凌晨0點的時候進行清零,要求給出解決的思路。

大概記得有兩種思路:一是使用update語句直接遍歷修改每一條記錄的積分字段,將其修改為0;二是刪除該欄位,然後重新新增積分字段,並且設定該欄位預設值為0。

答案是說第二種方式更優,但具體能優化多少並未說明。所以今天特地進行一下實驗。

1.使用test_database庫

2.建立user表

同樣,由於是進行實驗,所以資料庫引擎推薦使用myisam。批量插入更快。

3.建立儲存過程

4.呼叫儲存過程

5.查詢所有記錄數量

6.通過update將user_exp欄位修改為0

7.刪除user_exp欄位

8.重新新增user_exp欄位,並設定預設值為0

通過以上實驗不難發現,第二種方法在效率上要比第一種方法快出一倍左右。所以對於海量資料而言,修改操作若是重複性的,不推薦直接利用update進行修改,採用ddl語句修改表結構不失為一種更好的解決方案。

下面給出以上實驗的sql語句,方便大家進行測試。

#使用test_database庫

use test_database;

#建立user表

create table user(

id bigint(10) primary key not null auto_increment,

user_name varchar(10) default null,

user_exp int default 0

)engine=myisam auto_increment=100000001 default charset=utf8;

#定義儲存過程userproc

delimiter //

create procedure userproc()

begin

declare num int;

set num=1;

while num <=10000000 do

insert into user(user_name,user_exp) values(num,num);

set num=num+1;

end while;

end //

delimiter ;

#呼叫儲存過程userproc

call userproc();

#user表計數

select count(*) from user;

#修改所有記錄user_exp欄位為0

update user set user_exp=0;

#刪除user_exp列

alter table user drop column user_exp;

#新建user_exp列,並修改其預設值為0

alter table user add column user_exp int default 0;

Mysql 同一欄位多值模糊查詢

同一欄位多值模糊查詢,使用多個or進行鏈結,效率不高,但沒有更好的解決方案。有看到charindex 關鍵字,可查詢結果並不是模糊,舉個栗子 例如select from table where charindex name 張三,李四 0 二 同一值多字段模糊查詢,使用concat關鍵字,舉個栗子 ...

MySQL對某一字段去重

mysql有乙個去重關鍵字distinct,但是如果查詢的字段有很多,而想要去重的字段只是其中的某乙個,那麼僅僅用distinct是完成不了的,distince只能做到你查詢的那些欄位都是重複時才會去重。比如有一張使用者表的資料是這樣的 這裡我們本意是想查出一條資料,如果是這樣寫sql語句 sele...

arcpy批量更新shp某一字段的值

提取檔名更新到dlbh欄位 encoding utf 8 import csv import arcpy import os shuju r d short2.gdb wenjianjia r d desktop csv.gdb fish r d desktop yw fishnet.shp res...