對於mysql資料庫,對於mysql資料庫索引,以下描述正確的是

本文目錄一覽:

怎麼優化MySQL資料庫

1、選取最適用的欄位屬性,儘可能減少定義欄位長度,盡量把欄位設置NOT NULL,例如’省份,性別’,最好設置為ENUM

2、使用連接(JOIN)來代替子查詢:

a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid

WHERE orderinfo.customerid IS NULL

3、使用聯合(UNION)來代替手動創建的臨時表

a.創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

4、事務處理:

a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗

mysql_query(“BEGIN”);

mysql_query(“INSERT INTO customerinfo (name) VALUES (‘$name1’)”;

mysql_query(“SELECT * FROM `orderinfo` where customerid=”.$id”);

mysql_query(“COMMIT”);

5、鎖定表,優化事務處理:

a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。

包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,

不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作

mysql_query(“LOCK TABLE customerinfo READ, orderinfo WRITE”);

mysql_query(“SELECT customerid FROM `customerinfo` where id=”.$id);

mysql_query(“UPDATE `orderinfo` SET ordertitle=’$title’ where customerid=”.$id);

mysql_query(“UNLOCK TABLES”);

6、使用外鍵,優化鎖定表

a.把customerinfo里的customerid映射到orderinfo里的customerid,

任何一條沒有合法的customerid的記錄不會寫到orderinfo里

CREATE TABLE customerinfo

(

customerid INT NOT NULL,

PRIMARY KEY(customerid)

)TYPE = INNODB;

CREATE TABLE orderinfo

(

orderid INT NOT NULL,

customerid INT NOT NULL,

PRIMARY KEY(customerid,orderid),

FOREIGN KEY (customerid) REFERENCES customerinfo

(customerid) ON DELETE CASCADE

)TYPE = INNODB;

注意:’ON DELETE CASCADE’,該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order

表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型為INNODB;

7、建立索引:

a.格式:

(普通索引)-

創建:CREATE INDEX 索引名 ON tablename (索引欄位)

修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)

創表指定索引:CREATE TABLE tablename([…],INDEX[索引名](索引欄位))

(唯一索引)-

創建:CREATE UNIQUE 索引名 ON tablename (索引欄位)

修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)

創表指定索引:CREATE TABLE tablename([…],UNIQUE[索引名](索引欄位))

(主鍵)-

它是唯一索引,一般在創建表是建立,格式為:

CREATA TABLE tablename ([…],PRIMARY KEY[索引欄位])

8、優化查詢語句

a.最好在相同欄位進行比較操作,在建立好的索引欄位上盡量減少函數操作

例子1:

SELECT * FROM order WHERE YEAR(orderDate)2008;(慢)

SELECT * FROM order WHERE orderDate”2008-01-01″;(快)

例子2:

SELECT * FROM order WHERE addtime/724;(慢)

SELECT * FROM order WHERE addtime24*7;(快)

例子3:

SELECT * FROM order WHERE title like “%good%”;

SELECT * FROM order WHERE title=”good” and name”good”;

超詳細MySQL資料庫優化

資料庫優化一方面是找出系統的瓶頸,提高MySQL資料庫的整體性能,而另一方面需要合理的結構設計和參數調整,以提高用戶的相應速度,同時還要儘可能的節約系統資源,以便讓系統提供更大的負荷.

1. 優化一覽圖

2. 優化

筆者將優化分為了兩大類,軟優化和硬優化,軟優化一般是操作資料庫即可,而硬優化則是操作伺服器硬體及參數設置.

2.1 軟優化

2.1.1 查詢語句優化

1.首先我們可以用EXPLAIN或DESCRIBE(簡寫:DESC)命令分析一條查詢語句的執行信息.

2.例:

顯示:

其中會顯示索引和查詢數據讀取數據條數等信息.

2.1.2 優化子查詢

在MySQL中,盡量使用JOIN來代替子查詢.因為子查詢需要嵌套查詢,嵌套查詢時會建立一張臨時表,臨時表的建立和刪除都會有較大的系統開銷,而連接查詢不會創建臨時表,因此效率比嵌套子查詢高.

2.1.3 使用索引

索引是提高資料庫查詢速度最重要的方法之一,關於索引可以參高筆者MySQL資料庫索引一文,介紹比較詳細,此處記錄使用索引的三大注意事項:

2.1.4 分解表

對於欄位較多的表,如果某些欄位使用頻率較低,此時應當,將其分離出來從而形成新的表,

2.1.5 中間表

對於將大量連接查詢的表可以創建中間表,從而減少在查詢時造成的連接耗時.

2.1.6 增加冗餘欄位

類似於創建中間表,增加冗餘也是為了減少連接查詢.

2.1.7 分析表,,檢查表,優化表

分析表主要是分析表中關鍵字的分布,檢查表主要是檢查表中是否存在錯誤,優化表主要是消除刪除或更新造成的表空間浪費.

1. 分析表: 使用 ANALYZE 關鍵字,如ANALYZE TABLE user;

2. 檢查表: 使用 CHECK關鍵字,如CHECK TABLE user [option]

option 只對MyISAM有效,共五個參數值:

3. 優化表:使用OPTIMIZE關鍵字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不寫入日誌.,優化表只對VARCHAR,BLOB和TEXT有效,通過OPTIMIZE TABLE語句可以消除文件碎片,在執行過程中會加上只讀鎖.

2.2 硬優化

2.2.1 硬體三件套

1.配置多核心和頻率高的cpu,多核心可以執行多個線程.

2.配置大內存,提高內存,即可提高緩存區容量,因此能減少磁碟I/O時間,從而提高響應速度.

3.配置高速磁碟或合理分布磁碟:高速磁碟提高I/O,分布磁碟能提高並行操作的能力.

2.2.2 優化資料庫參數

優化資料庫參數可以提高資源利用率,從而提高MySQL伺服器性能.MySQL服務的配置參數都在my.cnf或my.ini,下面列出性能影響較大的幾個參數.

2.2.3 分庫分表

因為資料庫壓力過大,首先一個問題就是高峰期系統性能可能會降低,因為資料庫負載過高對性能會有影響。另外一個,壓力過大把你的資料庫給搞掛了怎麼辦?所以此時你必須得對系統做分庫分表 + 讀寫分離,也就是把一個庫拆分為多個庫,部署在多個資料庫服務上,這時作為主庫承載寫入請求。然後每個主庫都掛載至少一個從庫,由從庫來承載讀請求。

2.2.4 緩存集群

如果用戶量越來越大,此時你可以不停的加機器,比如說系統層面不停加機器,就可以承載更高的並發請求。然後資料庫層面如果寫入並發越來越高,就擴容加資料庫伺服器,通過分庫分表是可以支持擴容機器的,如果資料庫層面的讀並發越來越高,就擴容加更多的從庫。但是這裡有一個很大的問題:資料庫其實本身不是用來承載高並發請求的,所以通常來說,資料庫單機每秒承載的並發就在幾千的數量級,而且資料庫使用的機器都是比較高配置,比較昂貴的機器,成本很高。如果你就是簡單的不停的加機器,其實是不對的。所以在高並發架構里通常都有緩存這個環節,緩存系統的設計就是為了承載高並發而生。所以單機承載的並發量都在每秒幾萬,甚至每秒數十萬,對高並發的承載能力比資料庫系統要高出一到兩個數量級。所以你完全可以根據系統的業務特性,對那種寫少讀多的請求,引入緩存集群。具體來說,就是在寫資料庫的時候同時寫一份數據到緩存集群里,然後用緩存集群來承載大部分的讀請求。這樣的話,通過緩存集群,就可以用更少的機器資源承載更高的並發。

一個完整而複雜的高並發系統架構中,一定會包含:各種複雜的自研基礎架構系統。各種精妙的架構設計.因此一篇小文頂多具有拋磚引玉的效果,但是資料庫優化的思想差不多就這些了.

MySQL資料庫必會技能,虛擬列的用法

對於想要將自動生成的數據添加到表中的任何人來說, MySQL 虛擬列 是一個強大、易於使用和高級的功能。

INSERT 生成的列允許您在不使用and UPDATE 子句的情況下將自動生成的數據存儲在表中。 這個有用的特性自 5.7 版 起就已成為 MySQL 的一部分,它代表了在生成數據時觸發器的另一種方法。此外,生成的列可以幫助您更輕鬆、更高效地查詢。

虛擬列 列類似於普通列,但您不能手動更改其值。這是因為表達式定義了如何根據從同一行的其他列中讀取的其他值來生成生成列的值。因此,生成的列在表的域內工作,其定義不能涉及 JOIN 語句。

換句話說,您可以將生成的列視為一種視圖,但僅限於列。請注意,生成的列與 SQL 觸發器 不同,您只能在使用 CREATE TABLE or語句時定義它們,語法如下: ALTER TABLE

該 AS (generated_column_expression) 子句指定要添加或更新到表中的列是生成的列。定義 MySQL 將用於計算列值的 generation_expression 表達式,它不能引用另一個生成的列或除當前表的列之外的任何內容。另外,請注意生成表達式只能涉及不可變函數。例如,您不能在生成的列表達式定義中使用返回當前日期的函數,因為它是一個可變函數。

您還可以在關鍵字前面 AS 加上 GENERATED ALWAYS 關鍵字以使生成的列的性質更加明確,但這是可選的。然後,您可以指示生成列的類型是 VIRTUAL 還是 STORED 。您將在下面的章節中了解這兩種類型之間的區別。默認情況下,如果沒有在查詢中明確指定,MySQL 會將生成的列標記為 VIRTUAL .

現在讓我們看看生成的列語法在 CREATE TABLE 查詢中的作用:

在此示例中,該 full_name 列將自動存儲 first_name 和 last_name 列的連接。

如前所述,您可以將生成的列定義為 VIRTUAL 或 STORED。現在讓我們仔細看看這兩種類型。

MySQL 不存儲標記為 VIRTUAL 的 虛擬列 。這意味著 MySQL 在需要時動態評估其值。 BEFORE 這通常在觸發任何查詢後立即發生。換句話說,虛擬生成的列不佔用存儲空間。

MySQL 存儲任何生成的標記為 STORED 的列。這意味著每次插入或更新行時,MySQL 都會評估其值並將其存儲在磁碟上。換句話說,存儲列需要存儲空間,就好像它是普通列一樣。

現在讓我們進一步了解虛擬列和存儲生成列的優缺點。

優點

缺點

優點

缺點

採用生成的列有幾個原因,但以下三個是最重要的。

如您所見,您可以通過將四列與以下生成的列聚合來輕鬆生成此數據欄位:

這將產生:

在這種情況下,生成的列使您能夠直接在資料庫級別標準化數據欄位格式。此外,存儲生成的列避免了每次需要時都構造此欄位的不可避免的開銷。

通常,您使用網站 URL 中的資源 ID 或REST API來檢索您需要的數據。但是公開暴露您的 ID 可能會帶來安全問題。當您發現自己使用自動增量 ID 時尤其如此,這很容易預測並使抓取或機器人攻擊更容易。

為避免這種情況,您可以考慮通過使用自動生成的、隨機的、更安全的公共 ID 來隱藏您的原始 ID。您可以通過對您的 ID 進行散列處理,使用虛擬生成的列來實現這一點,如下所示:

請注意,為避免生成已知的哈希值,您可以將您的 ID 與特殊關鍵字連接起來。 在此處了解有關 MySQL 加密和壓縮功能的更多信息。

過濾數據時,有些列比其他列更有用。此外,您通常必須更改存儲在列中的值的表示形式,以使過濾更簡單或更直觀。您可以定義一個有用的生成列來存儲以所需格式執行過濾所需的信息,而不是在每個過濾器查詢中執行此操作。

例如,您可以定義一個生成的列,以便更輕鬆地找到籃球隊中的球員,如下所示:

這樣的列將產生:

如前所述,您只能在表中使用生成的列。此外,它們只能涉及不可變函數,並且MySQL 生成它們的值以響應 INSERT or UPDATE 查詢。另一方面,觸發器是 MySQL 自動執行的存儲程序,每當與特定表關聯的 或 事件發生 INSERT 時 UPDATE 。 DELETE 換句話說,觸發器可以涉及多個表和所有 MySQL 函數。與生成的列相比,這使它們成為更完整的解決方案。同時,MySQL 觸發器本質上使用和定義更複雜,也比生成的列慢。

如何修改mysql資料庫表結構

Online DDL 工具:pt-osc

對於 MySQL Online DDL 目前主流的有三種工具:

原生 Online DDL;

pt-osc(online-schema-change),

gh-ost

本文主要講解 pt-online-schema-change 的使用以及三種工具的簡單對比。

一、原理及限制

1.1 原理

1. 創建一個與原表結構相同的空表,表名是 _new 後綴;

2. 修改步驟 1 創建的空表的表結構;

3. 在原表上加三個觸發器:delete/update/insert,用於 copy 數據過程中,將原表中要執行的語句在新表中執行;

4. 將原表數據以數據塊(chunk)的形式 copy 到新表;

5. rename 原表為 old 表,並把新表 rename 為原表名,然後刪除舊錶;

6. 刪除觸發器。

什麼是MySql資料庫

 MySQL資料庫:

MySQL是一種開放源代碼的關係型資料庫管理系統(RDBMS),使用最常用的資料庫管理語言–結構化查詢語言(SQL)進行資料庫管理。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。

MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

資料庫簡介:

MySQL是一種開放源代碼的關係型資料庫管理系統(RDBMS),MySQL資料庫系統使用最常用的資料庫管理語言–結構化查詢語言(SQL)進行資料庫管理。

由於MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

MySQL這個名字,起源不是很明確。一個比較有影響的說法是,基本指南和大量的庫和工具帶有前綴「my」已經有10年以上,而且不管怎樣,MySQL AB創始人之一的Monty Widenius的女兒也叫My。這兩個到底是哪一個給出了MySQL這個名字至今依然是個迷,包括開發者在內也不知道。

MySQL的海豚標誌的名字叫「sakila」,它是由MySQL AB的創始人從用戶在「海豚命名」的競賽中建議的大量的名字表中選出的。獲勝的名字是由來自非洲史瓦濟蘭的開源軟體開發者Ambrose Twebaze提供。根據Ambrose所說,Sakila來自一種叫SiSwati的史瓦濟蘭方言,也是在Ambrose的家鄉烏干達附近的坦尚尼亞的Arusha的一個小鎮的名字。

MySQL,雖然功能未必很強大,但因為它的開源、廣泛傳播,導致很多人都了解到這個資料庫。它的歷史也富有傳奇性。

MySQL資料庫歷史:

MySQL的歷史最早可以追溯到1979年,那時Oracle也才小打小鬧,微軟的SQL Server影子都沒有。有一個人叫Monty Widenius, 為一個叫TcX的小公司打工,並用BASIC設計了一個報表工具,可以在4M主頻和16KB內存的計算機上運行。過了不久,又將此工具,使用C語言重寫,移植到Unix平台,當時,它只是一個很底層的面向報表的存儲引擎。這個工具叫做Unireg。

可是,這個小公司資源有限,Monty天賦極高,面對資源有限的不利條件,他反而更能發揮潛能,總是力圖寫出最高效的代碼。並因此養成了習慣。與Monty同在一起的還有一些別的同事,很少有人能堅持把那些代碼持續寫到20年後,而Monty卻做到了。

1990年,TcX的customer 中開始有人要求要為它的API提供SQL支持,當時,有人想到了直接使用商用資料庫算了,但是Monty覺得商用資料庫的速度難令人滿意。於是,他直接藉助於mSQL的代碼,將它集成到自己的存儲引擎中。但不巧的是,效果並不太好。於是, Monty雄心大起,決心自己重寫一個SQL支持。

1996年,MySQL 1.0發布,只面向一小撥人,相當於內部發布。到了96年10月,MySQL 3.11.1發布了,呵呵,沒有2.x版本。最開始,只提供了Solaris下的二進位版本。一個月後,Linux版本出現了。

緊接下來的兩年里,MySQL依次移植到各個平台下。它發布時,採用的許可策略,有些與眾不同:允許免費商用,但是不能將MySQL與自己的產品綁定在一起發布。如果想一起發布,就必須使用特殊許可,意味著要花銀子。當然,商業支持也是需要花銀子的。其它的,隨用戶怎麼用都可以。這種特殊許可為MySQL帶來了一些收入,從而為它的持續發展打下了良好的基礎。(細想想,PostgreSQL曾經有幾年限入低谷,可能與它的完全免費,不受任何限制有關係)。

MySQL3.22應該是一個標誌性的版本,提供了基本的SQL支持。

MySQL關係型資料庫於1998年1月發行第一個版本。它使用系統核心提供的多線程機制提供完全的多線程運行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等編程語言的編程介面(APIs),支持多種欄位類型並且提供了完整的操作符支持查詢中的SELECT和WHERE操作。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。

1999-2000年,有一家公司在瑞典成立了,叫MySQL AB (AB是瑞典語「股份公司」的意思)。 雇了幾個人,與Sleepycat合作,開發出了 Berkeley DB引擎, 因為BDB支持事務處理,所以,MySQL從此開始支持事務處理了。

2000年4月,MySQL對舊的存儲引擎進行了整理,命名為MyISAM。同時,2001年,Heikiki Tuuri向MySQL提出建議,希望能集成他們的存儲引擎InnoDB,這個引擎同樣支持事務處理,還支持行級鎖。

如今,遺憾的是,BDB和InnoDB好像都被Oracle收購了,為了消滅競爭對手,哪怕是開源的,都是不擇手段。

MySQL與InnoDB的正式結合版本是4.0。

到了MySQL5.0,2003年12月,開始有View,存儲過程之類的東東,當然,其間, bug也挺多。

在2008年1月16號 MySQL被Sun公司收購。

最近,MySQL的創始人Monty Widenius已經向Sun提交了辭呈。head都要走了。

據說,被Sun收購的公司多薄命,不知道MySQL今後前途如何,希望一路走好。相信MySQL的生命力還是很長久的。

時至今日 mysql 和 php 的結合絕對是完美.很多大型的網站也用到mysql資料庫.mysql的發展前景是非常光明的!

MySQL常用命令:

1:使用SHOW語句找出在伺服器上當前存在什麼資料庫:

mysql SHOW DATABASES;

2:2、創建一個資料庫MYSQLDATA

mysql CREATE DATABASE MYSQLDATA;

3:選擇你所創建的資料庫

mysql USE MYSQLDATA; (按回車鍵出現Database changed 時說明操作成功!)

4:查看現在的資料庫中存在什麼表

mysql SHOW TABLES;

5:創建一個資料庫表

mysql CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

6:顯示錶的結構:

mysql DESCRIBE MYTABLE;

7:往表中加入記錄

mysql insert into MYTABLE values (」hyq」,」M」);

8:用文本方式將數據裝入資料庫表中(例如D:/mysql.txt)

mysql LOAD DATA LOCAL INFILE 「D:/mysql.txt」 INTO TABLE MYTABLE;

9:導入.sql文件命令(例如D:/mysql.sql)

mysqluse database;

mysqlsource d:/mysql.sql;

10:刪除表

mysqldrop TABLE MYTABLE;

11:清空表

mysqldelete from MYTABLE;

12:更新表中數據

mysqlupdate MYTABLE set sex=」f」 where name=』hyq』;

全局管理許可權對應解釋:

FILE: 在MySQL伺服器上讀寫文件。

PROCESS: 顯示或殺死屬於其它用戶的服務線程。

RELOAD: 重載訪問控制表,刷新日誌等。

SHUTDOWN: 關閉MySQL服務。

資料庫/數據表/數據列許可權:

ALTER: 修改已存在的數據表(例如增加/刪除列)和索引。

CREATE: 建立新的資料庫或數據表。

DELETE: 刪除表的記錄。

DROP: 刪除數據表或資料庫。

INDEX: 建立或刪除索引。

INSERT: 增加表的記錄。

SELECT: 顯示/搜索表的記錄。

UPDATE: 修改表中已存在的記錄。

特別的許可權:

ALL: 允許做任何事(和root一樣)。

USAGE: 只允許登錄–其它什麼也不允許做。

MySQL資料庫導入方法:

MySQL資料庫的導入,有兩種方法:

1) 先導出資料庫SQL腳本,再導入;

2) 直接拷貝資料庫目錄和文件。

在不同操作系統或MySQL版本情況下,直接拷貝文件的方法可能會有不兼容的情況發生。

所以一般推薦用SQL腳本形式導入。下面分別介紹兩種方法。

2. 方法一 SQL腳本形式

操作步驟如下:

2.1. 導出SQL腳本

在原資料庫伺服器上,可以用phpMyAdmin工具,或者mysqldump命令行,導出SQL腳本。

2.1.1 用phpMyAdmin工具

導出選項中,選擇導出「結構」和「數據」,不要添加「DROP DATABASE」和「DROP TABLE」選項。

選中「另存為文件」選項,如果數據比較多,可以選中「gzipped」選項。

將導出的SQL文件保存下來。

2.1.2 用mysqldump命令行

命令格式

mysqldump -u 用戶名 -p 資料庫名 資料庫名.sql

範例:

mysqldump -u root -p abc abc.sql

(導出資料庫abc到abc.sql文件)

提示輸入密碼時,輸入該資料庫用戶名的密碼。

2.2. 創建空的資料庫

通過主控界面/控制面板,創建一個資料庫。假設資料庫名為abc,資料庫全權用戶為abc_f。

2.3. 將SQL腳本導入執行

同樣是兩種方法,一種用phpMyAdmin(mysql資料庫管理)工具,或者mysql命令行。

2.3.1 用phpMyAdmin工具

從控制面板,選擇創建的空資料庫,點「管理」,進入管理工具頁面。

在”SQL”菜單中,瀏覽選擇剛才導出的SQL文件,點擊「執行」以上載並執行。

注意:phpMyAdmin對上載的文件大小有限制,php本身對上載文件大小也有限制,如果原始sql文件

比較大,可以先用gzip對它進行壓縮,對於sql文件這樣的文本文件,可獲得1:5或更高的壓縮率。

gzip使用方法:

# gzip xxxxx.sql

得到

xxxxx.sql.gz文件。

提示輸入密碼時,輸入該資料庫用戶名的密碼。

3 直接拷貝

如果資料庫比較大,可以考慮用直接拷貝的方法,但不同版本和操作系統之間可能不兼容,要慎用。

3.1 準備原始文件

用tar打包為一個文件

3.2 創建空資料庫

3.3 解壓

在臨時目錄中解壓,如:

cd /tmp

tar zxf mydb.tar.gz

3.4 拷貝

將解壓後的資料庫文件拷貝到相關目錄

cd mydb/

cp * /var/lib/mysql/mydb/

對於FreeBSD:

cp * /var/db/mysql/mydb/

3.5 許可權設置

將拷貝過去的文件的屬主改為mysql:mysql,許可權改為660

chown mysql:mysql /var/lib/mysql/mydb/*

chmod 660 /var/lib/mysql/mydb/*

Mssql轉換mysql的方法:

1.導表結構

使用MySQL生成create腳本的方法。找到生成要導出的腳本,按MySQL的語法修改一下到MySQL資料庫中創建該表的列結構什麼的。

2.導表數據

在MSSQL端使用bcp導出文本文件:

bcp 「Select * FROM dbname.dbo.tablename;」 queryout tablename.txt -c -Slocalhost\db2005 -Usa

其中」”中是要導出的sql語句,-c指定使用\t進行欄位分隔,使用\n進行記錄分隔,-S指定資料庫伺服器及實例,-U指定用戶名,-P指定密碼.

在MySQL端使用mysqlimport 導入文本文件到相應表中

mysqlimport -uroot -p databasename /home/test/tablename.txt

其中-u指定用戶名,-p指定密碼,databasename指定資料庫名稱,表名與文件名相同

MySQL備份與恢復:

MySQL備份恢複數據的一般步驟

備份一個資料庫的例子:

1、備份前讀鎖定涉及的表

mysqlLOCK TABLES tbl1 READ,tbl1 READ,…

如果,你在mysqldump實用程序中使用–lock-tables選項則不必使用如上SQL語句。

2、導出資料庫中表的結構和數據

shellmysqldump –opt db_namedb_name.sql

3、啟用新的更新日誌

shellmysqladmin flush-logs

這樣可以記錄你備份後的數據改變為恢複數據準備。

4、解除表的讀鎖

mysqlUNLOCK TABLES;

為了加速上述過程,你可以這樣做:

shell mysqldump –lock-tables –opt db_namedb_name.sql; mysqladmin flush-logs

但是這樣可能會有點小問題。上命令在啟用新的更新日誌前就恢復表的讀鎖,

在更新繁忙的站點,可能有備份後的更新數據沒有記錄在新的日誌中。

現在恢復上面備份的資料庫

1、對涉及的表使用寫鎖

mysqlLOCK TABLES tbl1 WRITE,tbl1 WRITE,…

2、恢復備份的數據

shellmysql db_name db_name.sql

3、恢復更新日誌的內容

shellmysql –one-database db_name hostname.nnn

假設需要使用的日誌名字為hostname.nnn

4、啟用新的更新日誌

shellmysqladmin flush-logs

5、解除表的寫鎖

mysqlUNLOCK TABLES;

希望上面的例子能給你啟發,因為備份數據的手法多種多樣,你所使用的和上面所述可能大不一樣,但是對於備份和恢復中,表的鎖定、啟用新的更新日誌的時機應該是類似的,仔細考慮這個問題。

MySQL資料庫優化:

選擇InnoDB作為存儲引擎

大型產品的資料庫對於可靠性和並發性的要求較高,InnoDB作為默認的MySQL存儲引擎,相對於MyISAM來說是個更佳的選擇。

優化資料庫結構

組織資料庫的schema、表和欄位以降低I/O的開銷,將相關項保存在一起,並提前規劃,以便隨著數據量的增長,性能可以保持較高的水平。

設計數據表應盡量使其佔用的空間最小化,表的主鍵應儘可能短。·對於InnoDB表,主鍵所在的列在每個輔助索引條目中都是可複製的,因此如果有很多輔助索引,那麼一個短的主鍵可以節省大量空間。

僅創建你需要改進查詢性能的索引。索引有助於檢索,但是會增加插入和更新操作的執行時間。

InnoDB的ChangeBuffering特性

InnoDB提供了changebuffering的配置,可減少維護輔助索引所需的磁碟I/O。大規模的資料庫可能會遇到大量的表操作和大量的I/O,以保證輔助索引保持最新。當相關頁面不在緩衝池裡面時,InnoDB的changebuffer將會更改緩存到輔助索引條目,從而避免因不能立即從磁碟讀取頁面而導致耗時的I/O操作。當頁面被載入到緩衝池時,緩衝的更改將被合併,更新的頁面之後會刷新到磁碟。這樣做可提高性能,適用於MySQL5.5及更高版本。

InnoDB頁面壓縮

InnoDB支持對錶進行頁面級的壓縮。當寫入數據頁的時候,會有特定的壓縮演算法對其進行壓縮。壓縮後的數據會寫入磁碟,其打孔機制會釋放頁面末尾的空塊。如果壓縮失敗,數據會按原樣寫入。表和索引都會被壓縮,因為索引通常是資料庫總大小中佔比很大的一部分,壓縮可以顯著節約內存,I/O或處理時間,這樣就達到了提高性能和伸縮性的目的。它還可以減少內存和磁碟之間傳輸的數據量。MySQL5.1及更高版本支持該功能。

注意,頁面壓縮並不能支持共享表空間中的表。共享表空間包括系統表空間、臨時表空間和常規表空間。

使用批量數據導入

在主鍵上使用已排序的數據源進行批量數據的導入可加快數據插入的過程。否則,可能需要在其他行之間插入行以維護排序,這會導致磁碟I/O變高,進而影響性能,增加頁的拆分。關閉自動提交的模式也是有好處的,因為它會為每個插入執行日誌刷新到磁碟。在批量插入期間臨時轉移唯一鍵和外鍵檢查也可顯著降低磁碟I/O。對於新建的表,最好的做法是在批量導入後創建外鍵/唯一鍵約束。

一旦你的數據達到穩定的大小,或者增長的表增加了幾十或幾百兆位元組,就應該考慮使用OPTIMIZETABLE語句重新組織表並壓縮浪費的空間。對重新組織後的表進行全表掃描所需要的I/O會更少。

優化InnoDB磁碟I/O

增加InnoDB緩衝池大小可以讓查詢從緩衝池訪問而不是通過磁碟I/O訪問。通過調整系統變數innodb_flush_method來調整清除緩衝的指標使其達到最佳水平。

MySQL的內存分配

在為MySQL分配足夠的內存之前,請考慮不同領域對MySQL的內存需求。要考慮的關鍵領域是:並發連接——對於大量並發連接,排序和臨時表將需要大量內存。在撰寫本文時,對於處理3000+並發連接的資料庫,16GB到32GB的RAM是足夠的。

內存碎片可以消耗大約10%或更多的內存。像innodb_buffer_pool_size、key_buffer_size、query_cache_size等緩存和緩衝區要消耗大約80%的已分配內存。

日常維護

定期檢查慢的查詢日誌並優化查詢機制以有效使用緩存來減少磁碟I/O。優化它們,以掃描最少的行數,而不是進行全表掃描。

其他可以幫助DBA檢查和分析性能的日誌包括:錯誤日誌、常規查詢日誌、二進位日誌、DDL日誌(元數據日誌)。

定期刷新緩存和緩衝區以降低碎片化。使用OPTIMIZETABLE語句重新組織表並壓縮任何可能被浪費的空間。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150418.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-08 14:53
下一篇 2024-11-08 14:53

相關推薦

  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字元串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • 如何將Oracle索引變成另一個表?

    如果你需要將一個Oracle索引導入到另一個表中,可以按照以下步驟來完成這個過程。 一、創建目標表 首先,需要在資料庫中創建一個新的表格,用來存放索引數據。可以通過以下代碼創建一個…

    編程 2025-04-29
  • 如何在代碼中打出正確的橫杆

    在編程中,橫杆是一個很常見的符號,但是有些人可能會在打橫杆時出錯。本文將從多個方面詳細介紹如何在代碼中打出正確的橫杆。 一、正常使用橫杆 在代碼中,直接使用「-」即可打出橫杆。例如…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • 索引abc,bc會走索引嗎

    答案是:取決於MySQL版本和表結構 一、MySQL版本的影響 在MySQL 5.6之前的版本中,MySQL會同時使用abc和bc索引。但在MySQL 5.6及之後的版本中,MyS…

    編程 2025-04-29
  • Git config命令用法介紹:用正確的郵箱保障開發工作

    本文將詳細介紹如何使用git config命令配置Git的全局和本地用戶信息,特別是如何正確使用用戶郵箱,保障Git操作的正常進行。 一、git config命令介紹 Git中的每…

    編程 2025-04-29
  • Python切片索引越界是否會報錯

    解答:當對一個字元串、列表、元組進行切片時,如果索引越界會返回空序列,不會報錯。 一、切片索引的概念 切片是指對序列進行操作,從其中一段截取一個新序列。序列可以是字元串、列表、元組…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28

發表回復

登錄後才能評論