python數據庫優化_python | Mysql性能優化一

對mysql優化是一個綜合性的技術,主要包括

表的設計合理化(符合3NF)

添加適當索引(index) [四種: 普通索引、主鍵索引、唯一索引unique、全文索引]

分表技術(水平分割、垂直分割)

讀寫[寫: update/delete/add]分離

存儲過程 [模塊化編程,可以提高速度]

對mysql配置優化 [配置最大并發數my.ini, 調整緩存大小 ]

mysql服務器硬件升級

定時的去清除不需要的數據,定時進行碎片整理(MyISAM)

數據庫優化工作

對于一個以數據為中心的應用,數據庫的好壞直接影響到程序的性能,因此數據庫性能至關重要。一般來說,要保證數據庫的效率,要做好以下四個方面的工作:

① 數據庫設計

② sql語句優化

③ 數據庫參數配置

④ 恰當的硬件資源和操作系統

此外,使用適當的存儲過程,也能提升性能。

這個順序也表現了這四個工作對性能影響的大小

數據庫表設計

通俗地理解三個范式,對于數據庫設計大有好處。在數據庫設計中,為了更好地應用三個范式,就必須通俗地理解三個范式(通俗地理解是夠用的理解,并不是最科學最準確的理解):

第一范式:1NF是對屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關系型數據庫都滿足1NF)

第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;

第三范式:3NF是對字段冗余性的約束,它要求字段沒有冗余。 沒有冗余的數據庫設計可以做到。

但是,沒有冗余的數據庫未必是最好的數據庫,有時為了提高運行效率,就必須降低范式標準,適當保留冗余數據。具體做法是: 在概念數據模型設計時遵守第三范式,降低范式標準的工作放到物理數據模型設計時考慮。降低范式就是增加字段,允許冗余。

?數據庫的分類

關系型數據庫: mysql/oracle/db2/informix/sysbase/sql server

非關系型數據庫: (特點: 面向對象或者集合)

NoSql數據庫: MongoDB(特點是面向文檔)

舉例說明什么是適度冗余,或者說有理由的冗余!

上面這個就是不合適的冗余,原因是:

在這里,為了提高學生活動記錄的檢索效率,把單位名稱冗余到學生活動記錄表里。單位信息有500條記錄,而學生活動記錄在一年內大概有200萬數據量。 如果學生活動記錄表不冗余這個單位名稱字段,只包含三個int字段和一個timestamp字段,只占用了16字節,是一個很小的表。而冗余了一個 varchar(32)的字段后則是原來的3倍,檢索起來相應也多了這么多的I/O。而且記錄數相差懸殊,500 VS 2000000 ,導致更新一個單位名稱還要更新4000條冗余記錄。由此可見,這個冗余根本就是適得其反。

訂單表里面的Price就是一個冗余字段,因為我們可以從訂單明細表中統計出這個訂單的價格,但是這個冗余是合理的,也能提升查詢性能。

從上面兩個例子中可以得出一個結論:

1---n 冗余應當發生在1這一方.

SQL語句優化

SQL優化的一般步驟

通過show status命令了解各種SQL的執行頻率。

定位執行效率較低的SQL語句-(重點select)

通過explain分析低效率的SQL

確定問題并采取相應的優化措施

-- select語句分類

Select

Dml數據操作語言(insert update delete)

dtl 數據事物語言(commit rollback savepoint)

Ddl數據定義語言(create alter drop..)

Dcl(數據控制語言) grant revoke

-- Show status 常用命令

--查詢本次會話

Show session status like 'com_%'; //show session status like 'Com_select'

--查詢全局

Show global status like 'com_%';

-- 給某個用戶授權

grant all privileges on *.* to 'abc'@'%';

--為什么這樣授權 'abc'?表示用戶名 '@' 表示host, 查看一下mysql->user表就知道了

--回收權限

revoke all on *.* from 'abc'@'%';

--刷新權限[也可以不寫]

flush privileges;

SQL語句優化-show參數

MySQL客戶端連接成功后,通過使用show [session|global] status 命令可以提供服務器狀態信息。其中的session來表示當前的連接的統計結果,global來表示自數據庫上次啟動至今的統計結果。默認是session級別的。

下面的例子:

show status like 'Com_%';

其中Com_XXX表示XXX語句所執行的次數。

重點注意:Com_select,Com_insert,Com_update,Com_delete通過這幾個參數,可以容易地了解到當前數據庫的應用是以插入更新為主還是以查詢操作為主,以及各類的SQL大致的執行比例是多少。

還有幾個常用的參數便于用戶了解數據庫的基本情況。

Connections:試圖連接MySQL服務器的次數

Uptime:服務器工作的時間(單位秒)

Slow_queries:慢查詢的次數 (默認是慢查詢時間10s)

show status like 'Connections'

show status like 'Uptime'

show status like 'Slow_queries'

如何查詢mysql的慢查詢時間

Show variables like 'long_query_time';

修改mysql 慢查詢時間

set long_query_time=2

SQL語句優化-定位慢查詢

問題是: 如何從一個大項目中,迅速的定位執行速度慢的語句. (定位慢查詢)

首先我們了解mysql數據庫的一些運行狀態如何查詢(比如想知道當前mysql運行的時間/一共執行了多少次select/update/delete.. / 當前連接)

為了便于測試,我們構建一個大表(400 萬)-> 使用存儲過程構建

默認情況下,mysql認為10秒才是一個慢查詢.

修改mysql的慢查詢.

show variables like 'long_query_time' ; //可以顯示當前慢查詢時間

set long_query_time=1 ;//可以修改慢查詢時間

構建大表->大表中記錄有要求, 記錄是不同才有用,否則測試效果和真實的相差大.創建:

CREATE TABLE dept( /*部門表*/

deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*編號*/

dname VARCHAR(20) NOT NULL DEFAULT "", /*名稱*/

loc VARCHAR(13) NOT NULL DEFAULT "" /*地點*/

) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

CREATE TABLE emp

(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*編號*/

ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/

job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/

mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/

hiredate DATE NOT NULL,/*入職時間*/

sal DECIMAL(7,2) NOT NULL,/*薪水*/

comm DECIMAL(7,2) NOT NULL,/*紅利*/

deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部門編號*/

)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

CREATE TABLE salgrade

(

grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,

losal DECIMAL(17,2) NOT NULL,

hisal DECIMAL(17,2) NOT NULL

)ENGINE=MyISAM DEFAULT CHARSET=utf8;

測試數據

INSERT INTO salgrade VALUES (1,700,1200);

INSERT INTO salgrade VALUES (2,1201,1400);

INSERT INTO salgrade VALUES (3,1401,2000);

INSERT INTO salgrade VALUES (4,2001,3000);

INSERT INTO salgrade VALUES (5,3001,9999);

為了存儲過程能夠正常執行,我們需要把命令執行結束符修改delimiter $$

創建函數,該函數會返回一個指定長度的隨機字符串

create function rand_string(n INT)

returns varchar(255) #該函數會返回一個字符串

begin

#chars_str定義一個變量 chars_str,類型是 varchar(100),默認值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';

declare chars_str varchar(100) default

'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';

declare return_str varchar(255) default '';

declare i int default 0;

while i < n do

set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));

set i = i + 1;

end while;

return return_str;

end

創建一個存儲過程

create procedure insert_emp(in start int(10),in max_num int(10))

begin

declare i int default 0;

#set autocommit =0 把autocommit設置成0

set autocommit = 0;

repeat

set i = i + 1;

insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand());

until i = max_num

end repeat;

commit;

end

#調用剛剛寫好的函數, 1800000條記錄,從100001號開始

call insert_emp(100001,4000000);

這時我們如果出現一條語句執行時間超過1秒中,就會統計到.

如果把慢查詢的sql記錄到我們的一個日志中

在默認情況下,低版本的mysql不會記錄慢查詢,需要在啟動mysql時候,指定記錄慢查詢才可以

bin\mysqld.exe - -safe-mode? - -slow-query-log [mysql5.5 可以在my.ini指定]

bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

該慢查詢日志會放在data目錄下[在mysql5.0這個版本中時放在 mysql安裝目錄/data/下],在 mysql5.5.19下是需要查看

my.ini 的 datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/“來確定.

在mysql5.6中,默認是啟動記錄慢查詢的,my.ini的所在目錄為:C:\ProgramData\MySQL\MySQL Server 5.6,其中有一個配置項

slow-query-log=1

針對 mysql5.5啟動慢查詢有兩種方法

bin\mysqld.exe - -safe-mode? - -slow-query-log

也可以在my.ini 文件中配置:

[mysqld]

# The TCP/IP Port the MySQL Server will listen on

port=3306

slow-query-log

通過慢查詢日志定位執行效率較低的SQL語句。慢查詢日志記錄了所有執行時間超過long_query_time所設置的SQL語句。

show variables like 'long_query_time';

set long_query_time=2;

為dept表添加數據

desc dept;

ALTER table dept add id int PRIMARY key auto_increment;

CREATE PRIMARY KEY on dept(id);

create INDEX idx_dptno_dptname on dept(deptno,dname);

INSERT into dept(deptno,dname,loc) values(1,'研發部','康和盛大廈5樓501');

INSERT into dept(deptno,dname,loc) values(2,'產品部','康和盛大廈5樓502');

INSERT into dept(deptno,dname,loc) values(3,'財務部','康和盛大廈5樓503');

UPDATE emp set deptno=1 where empno=100002;

****測試語句***[對emp表的記錄可以為3600000 ,效果很明顯慢]

select * from emp where empno=(select empno from emp where ename='研發部')

如果帶上order by e.empno 速度就會更慢,有時會到1min多.

測試語句

select * from emp e,dept d where e.empno=100002 and e.deptno=d.deptno;

查看慢查詢日志:默認為數據目錄data中的host-name-slow.log。低版本的mysql需要通過在開啟mysql時使用- -log-slow-queries[=file_name]來配置

SQL語句優化-explain分析問題

Explain select * from emp where ename=“wsrcla”

會產生如下信息:

select_type:表示查詢的類型。

table:輸出結果集的表

type:表示表的連接類型

possible_keys:表示查詢時,可能使用的索引

key:表示實際使用的索引

key_len:索引字段的長度

rows:掃描出的行數(估算的行數)

Extra:執行情況的描述和說明

explain select * from emp where ename='JKLOIP'

如果要測試Extra的filesort可以對上面的語句修改

explain select * from emp order by ename

EXPLAIN詳解

id

SELECT識別符。這是SELECT的查詢序列號

id 示例

SELECT * FROM emp WHERE empno = 1 and ename = (SELECT ename FROM emp WHERE empno = 100001) \G;

select_type

PRIMARY??? :子查詢中最外層查詢

SUBQUERY : 子查詢內層第一個SELECT,結果不依賴于外部查詢

DEPENDENT SUBQUERY:子查詢內層第一個SELECT,依賴于外部查詢

UNION?? :UNION語句中第二個SELECT開始后面所有SELECT,

SIMPLE:簡單的 select 查詢,不使用 union 及子查詢

UNION :UNION 中的第二個或隨后的 select 查詢,不依賴于外部查詢的結果集

Table

顯示這一步所訪問數據庫中表名稱

Type

對表訪問方式

ALL:

SELECT * FROM emp \G

完整的表掃描 通常不好

SELECT * FROM (SELECT * FROM emp WHERE empno = 1) a ;

system:表僅有一行(=系統表)。這是const聯接類型的一個特

const:表最多有一個匹配行

Possible_keys

該查詢可以利用的索引,如果沒有任何索引顯示? null

Key

Mysql 從 Possible_keys 所選擇使用索引

Rows

估算出結果集行數

Extra

查詢細節信息

No tables :Query語句中使用FROM DUAL 或不含任何FROM子句

Using filesort :當Query中包含 ORDER BY 操作,而且無法利用索引完成排序,

Impossible WHERE noticed after reading const tables: MYSQL Query Optimizer

通過收集統計信息不可能存在結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373951.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL中文亂碼問題

項目中用到MySQL數據庫時中文出現亂碼問題&#xff08;中文字符都變成了&#xff1f;&#xff09;解決&#xff1a; 1、統一項目與數據庫的編碼&#xff0c;項目中用的是UTF-8因此我的把數據庫的編碼統一成UTF-8 修改方式&#xff1a;修改 MySQL根目錄中的 my.ini 文件替換d…

json與字符串互轉

1 字符串轉JSON var objeval((str"))var objJSON.parse(str)var objstr.parseJSON()2 JSON轉字符串 var strobj.toJSONString()var strJSON.stringify(obj)轉載于:https://www.cnblogs.com/liu-xia/p/5050878.html

使用RequestFactory API進行Spring GWT集成

從GWT 2.4開始&#xff0c;將RequestFactory API與后端的Spring服務集成很容易&#xff0c;您需要做的就是在服務器上創建一個自定義ServiceLocator&#xff0c;GWT將使用它來正確定位被調用的服務&#xff1a; public class SpringServiceLocator implements ServiceLocator {…

C++實例講解Binder通信

binder是android里面的通信機制&#xff0c;這就不說它如何如何好了&#xff0c;Goog已經說過了&#xff0c;這里不多說。binder是一個面向對象的編程方法&#xff0c;大量使用虛函數類。最近研究binder看到一網友寫的&#xff0c;就借鑒一下。這個例子很好的解釋里binder通信關…

2014編程之美初賽第一場

題目1 : 焦距 時間限制:2000ms單點時限:1000ms內存限制:256MB描述 一般來說&#xff0c;我們采用針孔相機模型&#xff0c;也就是認為它用到的是小孔成像原理。 在相機坐標系下&#xff0c;一般來說&#xff0c;我們用到的單位長度&#xff0c;不是“米”這樣的國際單位&#x…

高中python公開課怎么上好_如何上好高中英語公開課

談如何上好高中英語公開課對青年教師來說&#xff0c;開一節公開課&#xff0c;如同完成一次蛻變&#xff0c;累掉一層皮&#xff0c;有著刻骨銘心的陣痛&#xff0c;但換來的是突飛猛進的專業成長。可以說&#xff0c;公開課是青年教師培訓的有效途徑&#xff0c;是名師培養的…

Codeforces Round #261 (Div. 2) - E (459E)

題目連接&#xff1a;http://codeforces.com/contest/459/problem/E 題目大意&#xff1a;給定一張有向圖&#xff0c;無自環無重邊&#xff0c;每條邊有一個邊權&#xff0c;求最長嚴格上升路徑長度。(1≤n&#xff0c;m≤3 *10^5) 初見此題覺得以邊為點&#xff0c;以點為邊&…

回收對象以提高性能

總覽 在上一篇文章中&#xff0c;我說過對象反序列化更快的原因是由于使用了回收對象。 由于兩個原因&#xff0c;這可能令人驚訝&#xff1a;1&#xff09;相信如今創建對象是如此之快&#xff0c;無關緊要或與回收自己一樣快&#xff0c;2&#xff09;默認情況下&#xff0c;…

jquery GET POST

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <head> <!--引入百度庫--> <script src"http://libs.baidu.com/jquery/1.10.2/jquery.min.js"> </script> <title></title> <scrip…

C++高精度運算類bign (重載操作符)

大數據操作&#xff0c;有如下問題&#xff1a; 計算&#xff1a;45678913561232654213212314875231656511323132 456789135612326542132123*14875231656511323132 比較&#xff1a;7531479535511335666686565>753147953551451213356666865 ? long long類型存儲不了&…

oj系統格式錯誤_論文查重會不會檢查格式?【paperpp吧】

高等學校一般都會要求大學生在畢業時需要寫作畢業論文&#xff0c;并且會提前發出關于畢業論文的通知&#xff0c;在通知上一般會說明論文寫作的相關要求&#xff0c;其中就會規定論文的相關格式。當然&#xff0c;學校也會在通知中說明論文查重的相關事宜&#xff0c;那么論文…

JavaScript Cookies

相關&#xff1a;jquery-cookie cookie 是存儲于訪問者的計算機中的變量&#xff0c;常用來存儲用戶名字&#xff0c;密碼&#xff0c;日期&#xff0e; 示例&#xff1a; 1 document.cookie"usernameJohn Doe"; 2 document.cookie"usernameJohn Doe; expiresTh…

大數據 -- Hadoop集群搭建

Hadoop集群搭建 1.修改/etc/hosts文件 在每臺linux機器上&#xff0c;sudo vim /etc/hosts 編寫hosts文件。將主機名和ip地址的映射填寫進去。編輯完后&#xff0c;結果如下&#xff1a; 2.配置ssh&#xff0c;實現無密碼登錄 四臺虛擬機上&#xff0c;使用&#xff1a; ssh-ke…

通過示例休眠–第2部分(DetachedCriteria)

所以上次我們幫助正義聯盟有效地管理了他們的超級英雄。 今天&#xff0c;我們集中討論“復仇者聯盟”將如何使用冬眠的“分離標準”找出每個超級英雄的敵人&#xff0c;以保護他們的超級英雄。 您可以從此處下載工作示例。 在此示例中&#xff0c;我們僅考慮兩個實體。 復仇者…

2014編程之美初賽第二場

題目1 : 神奇的數列 時間限制:2000ms單點時限:1000ms內存限制:256MB描述 大神同學是一個熱愛數字的孩子&#xff0c;她無時無刻不在思考生活與數學的聯系。有一天&#xff0c;她發現其實公歷的設計是有講究的。 每4年就會多閏一天&#xff0c;每一百年又會有一年不是閏年&#…

usb大容量存儲設備驅動_usb無法識別怎么辦 如何解決usb識別故障【詳細步驟】...

usb無法識別怎么辦? 隨著計算機硬件飛速發展&#xff0c;外圍設備日益增多&#xff0c;鍵盤、鼠標等早已為人所共知&#xff0c;數碼相機、MP3隨身聽接踵而至&#xff0c;這么多的設備&#xff0c;如何接入個人計算機?USB就是基于這個目的產生的。USB是一個使計算機周邊設備連…

CSDN編程挑戰——《交替字符串》

交替字符串 題目詳情: 如果字符串str3能夠由str1和str2中的字符按順序交替形成&#xff0c;那么稱str3為str1和str2的交替字符串。例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "…

hdu-5834 Magic boy Bi Luo with his excited tree(樹形dp)

題目鏈接&#xff1a; Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1037 Accepted Submission(s): 298 Problem DescriptionBi Luo is a magic boy, he also has …

Java EE過去,現在和云7

最近的JavaOne 2011的一個突出主題是下一個主要的Java EE 7版本。 正如主題發言中所述&#xff0c;有關工作正在進行中。 它將包含我們已經從先行者那里知道的28個規范以及一些新規范。 沒人可以告訴您確切的號碼&#xff0c;因為EE 7僅在“及時”完成時才會接受新的規范。 這意…

python cnn識別圖像_笨方法學習CNN圖像識別(一)—— 圖片預處理

— 全文閱讀5分鐘 —在本文中&#xff0c;你將學習到以下內容&#xff1a;通過數據增強增加樣本量調整圖片大小便于網絡訓練前言圖像識別的準備工作就是要對我們拿到手的樣本圖片進行預處理&#xff0c;具體就是數據增強和調整圖片大小&#xff0c;這些準備工作都是為訓練網絡做…