日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库中update怎么用事例_MySQL中UPDATE语句使用的实例教程

發布時間:2024/1/1 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库中update怎么用事例_MySQL中UPDATE语句使用的实例教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、UPDATE常見用法首先建立測試環境:

DROP TABLE IF EXISTS t_test;

CREATE TABLE t_test (

bs bigint(20) NOT NULL auto_increment,

username varchar(20) NOT NULL,

password varchar(20) default NULL,

remark varchar(200) default NULL,

PRIMARY KEY (bs)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;

INSERT INTO t_test VALUES (1,'lavasoft','123456',NULL);

INSERT INTO t_test VALUES (2,'hello',NULL,NULL);

INSERT INTO t_test VALUES (3,'haha',zz,tt);

1、set一個字段在表t_test中設置第二條記錄(bs為2)的password為'***'。

update t_test t

set t.password = '***'

where t.bs = 2;

2、set多個字段在表t_test中設置第一條記錄(bs為1)的password為'*'、remark為'*'。

update t_test t

set t.password = '*', t.remark = '*'

where t.bs = 1;

3、set null值在表t_test中設置第三條記錄(bs為3)的password為null、remark為null。

update t_test t

set t.password = null, t.remark = null

where t.bs = 3;

這個是按照標準語法寫的,在不同的數據庫系統中,update還有更多的寫法,但是標準寫法都是支持的。以上三個例子為了說明情況,每次都更新一行。在實際中,可以通過where語句約束來控制更新行數。

二、UPDATE使用中的相關性能問題以及解決方法UPDATE的功能是更新表中的數據。這的語法和INSERT的第二種用法相似。必須提供表名以及SET表達式,在后面可以加WHERE以限制更新的記錄范圍。

UPDATE table_anem SET column_name1 = value1, column_name2 = value2, WHERE ;

如下面的語句將users表中id等于123的記錄的age改為24

UPDATE users SET age = 24 WHERE id = 123;

同樣,可以使用UPDATE更新多個字段的值

UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;

上面的UPDATE語句通過WHERE指定一個條件,否則,UPDATE將更新表中的所有記錄的值

百萬級別的數據,對于mysql應該沒有問題。

你這個sql的問題是,相當于修改ONE表里面所有記錄的AGE信息,而修改的過程是,對于每一條ONE里面的記錄,去TWO里面查詢,再修改。而且,期間很可能會有鎖之類的東西。

首先,這種sql不應該出現在業務邏輯里面,而應該是后臺的job里面。

如果一定要這么做,可以試著用相反的方式,如果不一樣的記錄不是特別多,那就找到ONE表里面AGE記錄跟TWO表不一樣的記錄,再修改, 例如大概象下面(可能語法不太對):

update ONE,TWO

set ONE.AGE=TWO.AGE

where ONE.ID=TWO.ID AND ONE.AGE != TWO.AGE

當我把數據調到了1000W就更新不了了,下面我來分析原因。

實例:需要根據用戶日志的ip地址計算出其地理地址

表結構:

用戶日志表(200萬條記錄),其中address是待填充的字段:

CREATE TABLE `tmp_open_ip` (

`email` varchar(60) NOT NULL DEFAULT '',

`address` varchar(50) NOT NULL DEFAULT '',

`ip` int(10) unsigned NOT NULL DEFAULT '0',

KEY `email` (`email`),

KEY `ip` (`ip`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

另ip地址數據庫表(44萬條記錄)

CREATE TABLE `ip` (

`s` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '開始ip',

`e` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '結束ip',

`a` varchar(50) NOT NULL DEFAULT '',

KEY `s` (`s`),

KEY `e` (`e`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

需要根據用戶日志表 tmp_open_ip 里的 ip字段到ip地址數據庫表里查詢出對應的地理地址,將地址填充到address字段。

使用如下update語句執行:

UPDATE tmp_open_ip AS u

INNER JOIN ip

ON u.ip BETWEEN ip.s AND ip.e

SET u.address = ip.a

在筆者的電腦上運行了速度非常之慢,執行了一個多小時(4500s)都沒有完,也不知道還要多久。

實在看不過去,于是想到使用insert 是否會快一些,于是重新導一張表 tmp_open_log 與tmp_open_log完全一致。

創建一張表 tmp_open_address,是insert的目標表,為了速度更快,沒建索引:

CREATE TABLE `tmp_open_address` (

`email` varchar(60) NOT NULL DEFAULT '',

`address` varchar(50) NOT NULL DEFAULT '',

`ip` int(10) unsigned NOT NULL DEFAULT '0'

) ENGINE=MyISAM DEFAULT CHARSET=utf8

執行insert 語句

insert into tmp_open_address (email,address,ip)

select l.email,ip.a,l.ip

from tmp_open_log as l inner join ip on l.ip between ip.s and ip.e ;

/* Affected rows: 2,543,124 Found rows: 0 Warnings: 0 Duration for 3 queries: 16.922 sec. */

不到17s!本來還想去倒杯水、稍事休息一下,結果已經執行完畢。

到本文寫完時,前面的update語句已經執行了5000s,結束仍是遙遙無期。

所以,對于大數據量執行update時,可以考慮改用insert 語句實現,可能麻煩一些,但高速帶來的收益遠大于麻煩!

后記:

直接殺死了update進程,去看看update執行了多少:運行

SELECT * FROM `tmp_open_ip` where address!=''

結果只有 11,373 ,照這個速度,要運行N天....

總結

以上是生活随笔為你收集整理的数据库中update怎么用事例_MySQL中UPDATE语句使用的实例教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。