国产激情久久久久影院小草_国产91高跟丝袜_99精品视频99_三级真人片在线观看

sql中的like語(yǔ)句詳解

時(shí)間:2024-10-16 05:59:14 SQL 我要投稿
  • 相關(guān)推薦

關(guān)于sql中的like語(yǔ)句詳解

  sql中l(wèi)ike語(yǔ)句詳解

  LIKE

  確定給定的字符串是否與指定的模式匹配。模式可以包含常規(guī)字符和通配符字符。模式匹配過(guò)程中,常規(guī)字符必須與字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。與使用 = 和 != 字符串比較運(yùn)算符相比,使用通配符可使 LIKE 運(yùn)算符更加靈活。如果任何參數(shù)都不屬于字符串?dāng)?shù)據(jù)類(lèi)型,Microsoft? sql server? 會(huì)將其轉(zhuǎn)換成字符串?dāng)?shù)據(jù)類(lèi)型(如果可能)。

  語(yǔ)法

  match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

  參數(shù)

  match_expression

  任何字符串?dāng)?shù)據(jù)類(lèi)型的有效 SQL Server 表達(dá)式。

  pattern

  match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

  通配符 描述 示例

   包含零個(gè)或更多字符的任意字符串。 WHERE title LIKE '%computer%' 將查找處于書(shū)名任意位置的包含單詞 computer 的所有書(shū)名。

  _(下劃線) 任何單個(gè)字符。 WHERE au_fname LIKE '_ean' 將查找以 ean 結(jié)尾的所有 4 個(gè)字母的名字(Dean、Sean 等)。

  [ ] 指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個(gè)字符。 WHERE au_lname LIKE '[C-P]arsen' 將查找以arsen 結(jié)尾且以介于 C 與 P 之間的任何單個(gè)字符開(kāi)始的作者姓氏,例如,Carsen、Larsen、Karsen 等。

  [^] 不屬于指定范圍 ([a-f]) 或集合 ([abcdef]) 的任何單個(gè)字符。 WHERE au_lname LIKE 'de[^l]%' 將查找以 de 開(kāi)始且其后的字母不為 l 的所有作者的姓氏。

  escape_character

  字符串?dāng)?shù)據(jù)類(lèi)型分類(lèi)中的所有數(shù)據(jù)類(lèi)型的任何有效 SQL Server 表達(dá)式。escape_character 沒(méi)有默認(rèn)值,且必須僅包含一個(gè)字符。

  結(jié)果類(lèi)型

  Boolean

  結(jié)果值

  如果 match_expression 匹配指定模式,LIKE 將返回 TRUE。

  注釋

  當(dāng)使用 LIKE 進(jìn)行字符串比較時(shí),模式字符串中的所有字符都有意義,包括起始或尾隨空格。如果查詢(xún)中的比較要返回包含"abc "(abc 后有一個(gè)空格)的所有行,則將不會(huì)返回包含"abc"(abc 后沒(méi)有空格)的列所在行。但是可以忽略模式所要匹配的表達(dá)式中的尾隨空格。如果查詢(xún)中的比較要返回包含"abc"(abc 后沒(méi)有空格)的所有行,則將返回以"abc"開(kāi)始且具有零個(gè)或多個(gè)尾隨空格的所有行。

  由于數(shù)據(jù)存儲(chǔ)方式的原因,使用包含 char 和 varchar 數(shù)據(jù)模式的字符串比較可能無(wú)法通過(guò) LIKE 比較。了解每種數(shù)據(jù)類(lèi)型的存儲(chǔ)方式以及導(dǎo)致 LIKE 比較失敗的原因十分重要。下面的示例將局部 char 變量傳遞給存儲(chǔ)過(guò)程,然后使用模式匹配查找某個(gè)作者的所有著作。在此過(guò)程中,作者的姓將作為變量傳遞。

  CREATE PROCEDURE find_books @AU_LNAME 20)

  AS

  SELECT @AU_LNAME = RTRIM(@AU_LNAME) + '%'

  SELECT t.title_id, t.title

  FROM authors a, titleauthor ta, titles t

  WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id

  ?? AND a.au_lname LIKE @AU_LNAME

  當(dāng)名字中包含的字符數(shù)小于 20 時(shí),char 變量 (@AU_LNAME) 將包含尾隨空格,這導(dǎo)致 find_books 過(guò)程中沒(méi)有行返回。由于 au_lname 列為 varchar 類(lèi)型,所以沒(méi)有尾隨空格。因?yàn)槲搽S空格是有意義的,所以此過(guò)程失敗。

  使用 LIKE 的模式匹配

  當(dāng)搜索 datetime 值時(shí),推薦使用 LIKE,因?yàn)?datetime 項(xiàng)可能包含各種日期部分。例如,如果將值 19981231 9:20 插入到名為 arrival_time 的列中,則子句 WHERE arrival_time = 9:20 將無(wú)法找到 9:20 字符串的精確匹配,因?yàn)?SQL Server 將其轉(zhuǎn)換為 1900 年 1 月 1 日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%' 將找到匹配。

  LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。當(dāng)所有參數(shù),包括 match_expression、pattern 和 escape_character(如果有)都是 ASCII 字符數(shù)據(jù)類(lèi)型時(shí),將執(zhí)行 ASCII 模式匹配。如果其中任何參數(shù)屬于 Unicode 數(shù)據(jù)類(lèi)型,則所有參數(shù)將被轉(zhuǎn)換為 Unicode 并執(zhí)行 Unicode 模式匹配。當(dāng)對(duì) Unicode 數(shù)據(jù)(nchar 或 nvarchar 數(shù)據(jù)類(lèi)型)使用 LIKE 時(shí),尾隨空格是有意義的。但是對(duì)于非 Unicode 數(shù)據(jù),尾隨空格沒(méi)有意義。Unicode LIKE 與 SQL-92 標(biāo)準(zhǔn)兼容。ASCII LIKE 與 SQL Server 的早期版本兼容。

  說(shuō)明? 如果使用 LIKE 進(jìn)行字符串比較,模式字符串中的所有字符都有意義,包括起始空格或尾隨空格。

  使用 % 通配符

  如果指定 LIKE '5%',SQL Server 將搜索后面帶有零個(gè)或多個(gè)任意字符的數(shù)字 5。

  例如,此查詢(xún)將顯示數(shù)據(jù)庫(kù)中所有的系統(tǒng)表,因?yàn)樗鼈兌家宰帜?sys 開(kāi)始:

  SELECT TABLE_NAME

  FROM INFORMATION_SCHEMA.TABLES

  WHERE TABLE_NAME LIKE 'sys%'

  說(shuō)明? 請(qǐng)注意:系統(tǒng)表可以隨版本不同而更改。推薦使用信息架構(gòu)視圖或適用的存儲(chǔ)過(guò)程處理 SQL Server 系統(tǒng)表。

  若要查閱非系統(tǒng)表的所有對(duì)象,請(qǐng)使用 NOT LIKE 'sys%'。如果共有 32 個(gè)對(duì)象且 LIKE 找到 13 個(gè)與模式匹配的名稱(chēng),則 NOT LIKE 將找到 19 個(gè)與 LIKE 模式不匹配的對(duì)象。

  使用 LIKE '[^s][^y][^s]%' 模式不一定每次找到的名稱(chēng)都相同。可能僅得到 14 個(gè)名稱(chēng)(而不是 19 個(gè)),除了系統(tǒng)表名稱(chēng)外,所有以 s 開(kāi)始或第二個(gè)字母為 y 或第三個(gè)字母為 s 的名稱(chēng)也都將從結(jié)果中消除。這是因?yàn)橛梅聪蛲ㄅ浞ヅ渥址欠植襟E進(jìn)行計(jì)算的,一次一個(gè)通配符。如果在計(jì)算過(guò)程中任一環(huán)節(jié)匹配失敗,那么就會(huì)將其消除。

  將通配符作為文字使用

  可以將通配符模式匹配字符串用作文字字符串,方法是將通配符放在括號(hào)中。下表顯示了使用 LIKE 關(guān)鍵字和 [ ] 通配符的示例。

  符號(hào) 含義

  LIKE '5[%]' 5%

  LIKE '[_]n' _n

  LIKE '[a-cdf]' a、b、c、d 或 f

  LIKE '[-acdf]' -、a、c、d 或 f

  LIKE '[ [ ]' [

  LIKE ']' ]

  LIKE 'abc[_]d%' abc_d 和 abc_de

  LIKE 'abc[def]' abcd、abce 和 abcf

  使用 ESCAPE 子句的模式匹配

  可搜索包含一個(gè)或多個(gè)特殊通配符的字符串。例如,customers 數(shù)據(jù)庫(kù)中的 discounts 表可能存儲(chǔ)含百分號(hào) (%) 的折扣值。若要搜索作為字符而不是通配符的百分號(hào),必須提供 ESCAPE 關(guān)鍵字和轉(zhuǎn)義符。例如,一個(gè)樣本數(shù)據(jù)庫(kù)包含名為 comment 的列,該列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,請(qǐng)指定由 WHERE comment LIKE '%30!%%' ESCAPE '!' 組成的 WHERE 子句。如果不指定 ESCAPE 和轉(zhuǎn)義符,SQL Server 將返回所有含字符串 30 的行。

  下例說(shuō)明如何在 pubs 數(shù)據(jù)庫(kù) titles 表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased":

  USE pubs

  GO

  SELECT notes

  FROM titles

  WHERE notes LIKE '50%% off when 100 or more copies are purchased'

  ?? ESCAPE '%'

  GO

  示例

  A. 使用帶 % 通配符的 LIKE

  下例查找 authors 表中所有區(qū)號(hào)為 415 的電話號(hào)碼。

  USE pubs

  GO

  SELECT phone

  FROM authors

  WHERE phone LIKE '415%'

  ORDER by au_lname

  GO

  下面是結(jié)果集:

  phone?

  415 658-9932

  415 548-7723

  415 836-7128

  415 986-7020

  415 836-7128

  415 534-9219

  415 585-4620

  415 354-7128

  415 834-2919

  415 843-2991

  415 935-4228

  (11 row(s) affected)

  B. 使用帶 % 通配符的 NOT LIKE

  下例查找 authors 表中所有區(qū)號(hào)不是 415 的電話號(hào)碼。

  USE pubs

  GO

  SELECT phone

  FROM authors

  WHERE phone NOT LIKE '415%'

  ORDER BY au_lname

  GO

  下面是結(jié)果集:

  phone?

  503 745-6402

  219 547-9982

  615 996-8275

  615 297-2723

  707 938-6445

  707 448-4982

  408 286-2428

  301 946-8853

  801 826-0752

  801 826-0752

  913 843-0462

  408 496-7223

  (12 row(s) affected)

  C. 使用 ESCAPE 子句

  下例使用 ESCAPE 子句和轉(zhuǎn)義符查找 mytbl2 表的 c1 列中的精確字符串 10-15%。

  USE pubs

  GO

  IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

  WHERE TABLE_NAME = 'mytbl2')

  ?? DROP TABLE mytbl2

  GO

  USE pubs

  GO

  CREATE TABLE mytbl2

  ?c1 sysname

  GO

  INSERT mytbl2 VALUES ('Discount is 10-15% off')

  INSERT mytbl2 VALUES ('Discount is .10-.15 off')

  GO

  SELECT c1

  FROM mytbl2

  WHERE c1 LIKE '-15!% off%' ESCAPE '!'

  GO

  D. 使用 [ ] 通配符

  下例查找名字為 Cheryl 或 Sheryl 的作者。

  USE pubs

  GO

  SELECT au_lname, au_fname, phone

  FROM authors

  WHERE au_fname LIKE '[CS]heryl'

  ORDER BY au_lname ASC, au_fname ASC

  GO

  下例查找姓為 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

  USE pubs

  GO

  SELECT au_lname, au_fname, phone

  FROM authors

  WHERE au_lname LIKE '[CK]ars[eo]n'

  ORDER BY au_lname ASC, au_fname ASC

  GO

  如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的備份與恢復(fù)

  在數(shù)據(jù)庫(kù)表丟失或損壞的情況下,備份你的數(shù)據(jù)庫(kù)是很重要的。如果發(fā)生系統(tǒng)崩潰,你肯定想能夠?qū)⒛愕谋肀M可能丟失最少的數(shù)據(jù)恢復(fù)到崩潰發(fā)生時(shí)的狀態(tài)。有時(shí),正是MySQL管理員造成破壞。管理員已經(jīng)知道表以破壞,用諸如vi或Emacs等編輯器試圖直接編輯它們,這對(duì)表絕對(duì)不是件好事!

  備份數(shù)據(jù)庫(kù)兩個(gè)主要方法是用mysqldump程序或直接拷貝數(shù)據(jù)庫(kù)文件(如用cp、cpio或tar等)。每種方法都有其優(yōu)缺點(diǎn):

  mysqldump與MySQL服務(wù)器協(xié)同操作。直接拷貝方法在服務(wù)器外部進(jìn)行,并且你必須采取措施保證沒(méi)有客戶(hù)正在修改你將拷貝的表。如果你想用文件系統(tǒng)備份來(lái)備份數(shù)據(jù)庫(kù),也會(huì)發(fā)生同樣的問(wèn)題:如果數(shù)據(jù)庫(kù)表在文件系統(tǒng)備份過(guò)程中被修改,進(jìn)入備份的表文件主語(yǔ)不一致的狀態(tài),而對(duì)以后的恢復(fù)表將失去意義。文件系統(tǒng)備份與直接拷貝文件的區(qū)別是對(duì)后者你完全控制了備份過(guò)程,這樣你能采取措施確保服務(wù)器讓表不受干擾。

  mysqldump比直接拷貝要慢些。

  mysqldump生成能夠移植到其它機(jī)器的文本文件,甚至那些有不同硬件結(jié)構(gòu)的機(jī)器上。直接拷貝文件不能移植到其它機(jī)器上,除非你正在拷貝的表使用MyISAM存儲(chǔ)格式。ISAM表只能在相似的硬件結(jié)構(gòu)的機(jī)器上拷貝。在MySQL 3.23中引入的MyISAM表存儲(chǔ)格式解決了該問(wèn)題,因?yàn)樵摳袷绞菣C(jī)器無(wú)關(guān)的,所以直接拷貝文件可以移植到具有不同硬件結(jié)構(gòu)的機(jī)器上。只要滿(mǎn)足兩個(gè)條件:另一臺(tái)機(jī)器必須也運(yùn)行MySQL 3.23或以后版本,而且文件必須以MyISAM格式表示,而不是ISAM格式。

  不管你使用哪種備份方法,如果你需要恢復(fù)數(shù)據(jù)庫(kù),有幾個(gè)原則應(yīng)該遵守,以確保最好的結(jié)果:

  定期實(shí)施備份。建立一個(gè)計(jì)劃并嚴(yán)格遵守。

  讓服務(wù)器執(zhí)行更新日志。當(dāng)你在崩潰后需要恢復(fù)數(shù)據(jù)時(shí),更新日志將幫助你。在你用備份文件恢復(fù)數(shù)據(jù)到備份時(shí)的狀態(tài)后,你可以通過(guò)運(yùn)行更新日志中的查詢(xún)?cè)俅芜\(yùn)用備份后面的修改,這將數(shù)據(jù)庫(kù)中的表恢復(fù)到崩潰發(fā)生時(shí)的狀態(tài)。

  以文件系統(tǒng)備份的術(shù)語(yǔ)講,數(shù)據(jù)庫(kù)備份文件代表完全傾倒(full dump),而更新日志代表漸進(jìn)傾倒(incremental dump)。

  使用一種統(tǒng)一的和易理解的備份文件命名機(jī)制。象backup1、buckup2等不是特別有意義。當(dāng)實(shí)施你的恢復(fù)時(shí),你將浪費(fèi)時(shí)間找出文件里是什么東西。你可能發(fā)覺(jué)用數(shù)據(jù)庫(kù)名和日期構(gòu)成備份文件名會(huì)很有用。例如:

  %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

  %mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02

  你可能想在生成備份后壓縮它們。備份一般都很大!你也需要讓你的備份文件有過(guò)期期限以避免它們填滿(mǎn)你的磁盤(pán),就象你讓你的日志文件過(guò)期那樣。

  用文件系統(tǒng)備份備份你的備份文件。如果遇上了一個(gè)徹底崩潰,不僅清除了你的數(shù)據(jù)目錄,也清除了包含你的數(shù)據(jù)庫(kù)備份的磁盤(pán)驅(qū)動(dòng)器,你將真正遇上了麻煩。也要備份你的更新日志。

  將你的備份文件放在不同于用于你的數(shù)據(jù)庫(kù)的文件系統(tǒng)上。這將降低由于生成備份而填滿(mǎn)包含數(shù)據(jù)目錄的文件系統(tǒng)的可能性。

  用于創(chuàng)建備份的技術(shù)同樣對(duì)拷貝數(shù)據(jù)庫(kù)到另一臺(tái)機(jī)器有用。最常見(jiàn)地,一個(gè)數(shù)據(jù)庫(kù)被轉(zhuǎn)移到了運(yùn)行在另一臺(tái)主機(jī)上的服務(wù)器,但是你也可以將數(shù)據(jù)轉(zhuǎn)移到同一臺(tái)主機(jī)上的另一個(gè)服務(wù)器。

  1、使用mysqldump備份和拷貝數(shù)據(jù)庫(kù)

  當(dāng)你使用mysqldumo程序產(chǎn)生數(shù)據(jù)庫(kù)備份文件時(shí),缺省地,文件內(nèi)容包含創(chuàng)建正在傾倒的表的CREATE語(yǔ)句和包含表中行數(shù)據(jù)的INSERT語(yǔ)句。換句話說(shuō),mysqldump產(chǎn)生的輸出可在以后用作mysql的輸入來(lái)重建數(shù)據(jù)庫(kù)。

  你可以將整個(gè)數(shù)據(jù)庫(kù)傾倒進(jìn)一個(gè)單獨(dú)的文本文件中,如下:

  %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

  輸出文件的開(kāi)頭看起來(lái)象這樣:

  # MySQL Dump 6.0

  # Host: localhost Database: samp_db

  # Server version 3.23.2-alpha-log

  # Table structure for table 'absence'

  CREATE TABLE absence(

  student_id int(10) unsigned DEFAULT '0' NOT NULL,

  date date DEFAULT '0000-00-00' NOT NULL,

  PRIMARY KEY (student_id,date)

  # Dumping data for table 'absence'

  INSERT INTO absence VALUES (3,'1999-09-03');

  INSERT INTO absence VALUES (5,'1999-09-03');

  INSERT INTO absence VALUES (10,'1999-09-08');

  文件剩下的部分有更多的INSERT和CREATE TABLE語(yǔ)句組成。

  如果你想壓縮備份,使用類(lèi)似如下的命令:

  %mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz

  如果你要一個(gè)龐大的數(shù)據(jù)庫(kù),輸出文件也將很龐大,可能難于管理。如果你愿意,你可以在mysqldump命令行的數(shù)據(jù)庫(kù)名后列出單獨(dú)的表名來(lái)傾到它們的內(nèi)容,這將傾倒文件分成較小、更易于管理的文件。下例顯示如何將samp_db數(shù)據(jù)庫(kù)的一些表傾到進(jìn)分開(kāi)的文件中:

  %mysqldump samp_db student score event absence >grapbook.sql

  %mysqldump samp_db member president >hist-league.sql

  如果你生成準(zhǔn)備用于定期刷新另一個(gè)數(shù)據(jù)庫(kù)內(nèi)容的備份文件,你可能想用--add-drop-table選項(xiàng)。這告訴服務(wù)器將DROP TABLE IF EXISTS語(yǔ)句寫(xiě)入備份文件,然后,當(dāng)你取出備份文件并把它裝載進(jìn)第二個(gè)數(shù)據(jù)庫(kù)時(shí),如果表已經(jīng)存在,你不會(huì)得到一個(gè)錯(cuò)誤。

  如果你倒出一個(gè)數(shù)據(jù)庫(kù)以便能把數(shù)據(jù)庫(kù)轉(zhuǎn)移到另一個(gè)服務(wù)器,你甚至不必創(chuàng)建備份文件。要保證數(shù)據(jù)庫(kù)存在于另一臺(tái)主機(jī),然后用管道傾倒數(shù)據(jù)庫(kù),這樣mysql能直接讀取mysqldump的輸出。例如:你想從主機(jī)pit-viper.snake.net拷貝數(shù)據(jù)庫(kù)samp_db到boa.snake.net,可以這樣很容易做到:

  %mysqladmin -h boa.snake.net create samp_db

  %mysqldump samp_db | mysql -h boa.snake.net samp_db

  以后,如果你想再次刷新boa.snake.net上的數(shù)據(jù)庫(kù),跳過(guò)mysqladmin命令,但要對(duì)mysqldump加上--add-drop-table以避免的得到表已存在的錯(cuò)誤:

  %mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db

  mysqldump其它有用的選項(xiàng)包括:

  --flush-logs和--lock-tables組合將對(duì)你的數(shù)據(jù)庫(kù)檢查點(diǎn)有幫助。--lock-tables鎖定你正在傾倒的所有表,而--flush-logs關(guān)閉并重新打開(kāi)更新日志文件,新的更新日志將只包括從備份點(diǎn)起的修改數(shù)據(jù)庫(kù)的查詢(xún)。這將設(shè)置你的更新日志檢查點(diǎn)位備份時(shí)間。(然而如果你有需要執(zhí)行個(gè)更新的客戶(hù),鎖定所有表對(duì)備份期間的客戶(hù)訪問(wèn)不是件好事。)

  如果你使用--flush-logs設(shè)置檢查點(diǎn)到備份時(shí),有可能最好是傾倒整個(gè)數(shù)據(jù)庫(kù)。如果你傾倒單獨(dú)的文件,較難將更新日志檢查點(diǎn)與備份文件同步。在恢復(fù)期間,你通常按數(shù)據(jù)庫(kù)為基礎(chǔ)提取更新日志內(nèi)容,對(duì)單個(gè)表沒(méi)有提取更新的選擇,所以你必須自己提取它們。

  缺省地,mysqldump在寫(xiě)入前將一個(gè)表的整個(gè)內(nèi)容讀進(jìn)內(nèi)存。這通常確實(shí)不必要,并且實(shí)際上如果你有一個(gè)大表,幾乎是失敗的。你可用--quick選項(xiàng)告訴mysqldump只要它檢索出一行就寫(xiě)出每一行。為了進(jìn)一步優(yōu)化傾倒過(guò)程,使用--opt而不是--quick。--opt選項(xiàng)打開(kāi)其它選項(xiàng),加速數(shù)據(jù)的傾倒和把它們讀回。

  用--opt實(shí)施備份可能是最常用的方法,因?yàn)閭浞菟俣壬系膬?yōu)勢(shì)。然而,要警告你,--opt選項(xiàng)確實(shí)有代價(jià),--opt優(yōu)化的是你的備份過(guò)程,不是其他客戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。--opt選項(xiàng)通過(guò)一次鎖定所有表阻止任何人更新你正在傾倒的任何表。你可在一般數(shù)據(jù)庫(kù)訪問(wèn)上很容易看到其效果。當(dāng)你的數(shù)據(jù)庫(kù)一般非常頻繁地使用,只是一天一次地調(diào)節(jié)備份。

  一個(gè)具有--opt的相反效果的選項(xiàng)是--dedayed。該選項(xiàng)使得mysqldump寫(xiě)出INSERT DELAYED語(yǔ)句而不是INSERT語(yǔ)句。如果你將數(shù)據(jù)文件裝入另一個(gè)數(shù)據(jù)庫(kù)并且你想是這個(gè)操作對(duì)可能出現(xiàn)在該數(shù)據(jù)庫(kù)中的查詢(xún)的影響最小,--delayed對(duì)此很有幫助。

  --compress選項(xiàng)在你拷貝數(shù)據(jù)庫(kù)到另一臺(tái)機(jī)器上時(shí)很有幫助,因?yàn)樗鼫p少網(wǎng)絡(luò)傳輸字節(jié)的數(shù)量。下面有一個(gè)例子,注意到--compress對(duì)與遠(yuǎn)端主機(jī)上的服務(wù)器通信的程序才給出,而不是對(duì)與本地主機(jī)連接的程序:

  %mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db

  mysqldump有很多選項(xiàng),詳見(jiàn)《MySQL參考手冊(cè)》。

  2、使用直接拷貝數(shù)據(jù)庫(kù)的備份和拷貝方法

  另一種不涉及mysqldump備份數(shù)據(jù)庫(kù)和表的方式是直接拷貝數(shù)據(jù)庫(kù)表文件。典型地,這用諸如cp、tar或cpio實(shí)用程序。本文的例子使用cp。

  當(dāng)你使用一種直接備份方法時(shí),你必須保證表不在被使用。如果服務(wù)器在你則正在拷貝一個(gè)表時(shí)改變它,拷貝就失去意義。

  保證你的拷貝完整性的最好方法是關(guān)閉服務(wù)器,拷貝文件,然后重啟服務(wù)器。如果你不想關(guān)閉服務(wù)器,要在執(zhí)行表檢查的同時(shí)鎖定服務(wù)器。如果服務(wù)器在運(yùn)行,相同的制約也適用于拷貝文件,而且你應(yīng)該使用相同的鎖定協(xié)議讓服務(wù)器“安靜下來(lái)。

  假設(shè)服務(wù)器關(guān)閉或你已經(jīng)鎖定了你想拷貝的表,下列顯示如何將整個(gè)samp_db數(shù)據(jù)庫(kù)備份到一個(gè)備份目錄(DATADIR表示服務(wù)器的數(shù)據(jù)目錄):

  %cd DATADIR

  %cp -r samp_db /usr/archive/mysql

  單個(gè)表可以如下備份:

  %cd DATADIR/samp_db

  %cp member.* /usr/archive/mysql/samp_db

  %cp score.* /usr/archive/mysql/samp_db

  當(dāng)你完成了備份時(shí),你可; 更多內(nèi)容請(qǐng)看Linux數(shù)據(jù)庫(kù)寶典; MySQL; MySQL安全專(zhuān)題,或進(jìn)入討論組討論。

  MySQL存儲(chǔ)引擎選擇InnoDB還是MyISAM

  MyISAM 是MySQL中默認(rèn)的存儲(chǔ)引擎,一般來(lái)說(shuō)不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲(chǔ)引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌拢@里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見(jiàn)的。

  下面先讓我們回答一些問(wèn)題:

  1.你的數(shù)據(jù)庫(kù)有外鍵嗎?

  2.你需要事務(wù)支持嗎?

  3.你需要全文索引嗎?

  4.你經(jīng)常使用什么樣的查詢(xún)模式?

  5.你的數(shù)據(jù)有多大?

  思考上面這些問(wèn)題可以讓你找到合適的方向,但那并不是絕對(duì)的。如果你需要事務(wù)處理或是外鍵,那么InnoDB 可能是比較好的方式。如果你需要全文索引,那么通常來(lái)說(shuō) MyISAM是好的選擇,因?yàn)檫@是系統(tǒng)內(nèi)建的,然而,我們其實(shí)并不會(huì)經(jīng)常地去測(cè)試兩百萬(wàn)行記錄。所以,就算是慢一點(diǎn),我們可以通過(guò)使用Sphinx從InnoDB中獲得全文索引。

  數(shù)據(jù)的大小,是一個(gè)影響你選擇什么樣存儲(chǔ)引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫(kù)的在小決定了故障恢復(fù)的時(shí)間長(zhǎng)短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快。而MyISAM可能會(huì)需要幾個(gè)小時(shí)甚至幾天來(lái)干這些事,InnoDB只需要幾分鐘。

  您操作數(shù)據(jù)庫(kù)表的習(xí)慣可能也會(huì)是一個(gè)對(duì)性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會(huì)非常快,而在InnoDB 表下可能會(huì)很痛苦。而主鍵查詢(xún)則在InnoDB下會(huì)相當(dāng)相當(dāng)?shù)目,但需要小心的是如果我們的主鍵太長(zhǎng)了也會(huì)導(dǎo)致性能問(wèn)題。大批的s 語(yǔ)句在MyISAM下會(huì)快一些,但是updates 在InnoDB 下會(huì)更快一些——尤其在并發(fā)量大的時(shí)候。

  所以,到底你檢使用哪一個(gè)呢?根據(jù)經(jīng)驗(yàn)來(lái)看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會(huì)更適合。當(dāng)然,在大型的環(huán)境下使用MyISAM 也會(huì)有很大成功的時(shí)候,但卻不總是這樣的。如果你正在計(jì)劃使用一個(gè)超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用InnoDB方式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲(chǔ),轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會(huì)讓你有非常壞的體驗(yàn)。

  區(qū)別總結(jié):

  1.InnoDB不支持FULLTEXT類(lèi)型的索引。

  2.InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語(yǔ)句包含 where條件時(shí),兩種表的操作是一樣的。

  3.對(duì)于AUTO_INCREMENT類(lèi)型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。

  4.DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。

  5.LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用。

  另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,例如table set num=1 where name like “%aaa%

  提升InnoDB性能的方法:

  my.ini里面:

  innodb_flush_log_at_trx_commit=1

  請(qǐng)把1改為0

  對(duì)于支持事物的InnoDB類(lèi)型的標(biāo),影響速度的主要原因是AUTOCOMMIT默認(rèn)設(shè)置是打開(kāi)的,而且程序沒(méi)有顯式調(diào)用BEGIN 開(kāi)始事務(wù),導(dǎo)致每插入一條都自動(dòng)Commit,嚴(yán)重影響了速度?梢栽趫(zhí)行sql前調(diào)用begin,多條sql形成一個(gè)事物(即使autocommit打開(kāi)也可以),將大大提高性能。

  MyISAM和InnoDB存儲(chǔ)引擎性能差別并不是很大,針對(duì)InnoDB來(lái)說(shuō),影響性能的主要是 innodb_flush_log_at_trx_commit 這個(gè)選項(xiàng),如果設(shè)置為1的話,那么每次插入數(shù)據(jù)的時(shí)候都會(huì)自動(dòng)提交,導(dǎo)致性能急劇下降,應(yīng)該是跟刷新日志有關(guān)系,設(shè)置為0效率能夠看到明顯提升,當(dāng)然,同 樣你可以SQL中提交“SET AUTOCOMMIT = 0來(lái)設(shè)置達(dá)到好的性能。另外,還聽(tīng)說(shuō)通過(guò)設(shè)置innodb_buffer_pool_size能夠提升InnoDB的性能,但是我測(cè)試發(fā)現(xiàn)沒(méi)有特別明顯 的提升。

  基本上我們可以考慮使用InnoDB來(lái)替代我們的MyISAM引擎了,因?yàn)镮nnoDB自身很多良好的特點(diǎn),比如事務(wù)支持、存儲(chǔ) 過(guò)程、視圖、行級(jí)鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多,當(dāng)然,相應(yīng)的在my.cnf中的配置也是比較關(guān)鍵 的,良好的配置,能夠有效的加速你的應(yīng)用。

  任何一種表都不是萬(wàn)能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類(lèi)型來(lái)選擇合適的表類(lèi)型,才能最大的發(fā)揮MySQL的性能優(yōu)勢(shì)。

  查看是哪一個(gè)種引擎?

  my.ini里面:

  default-storage-engine=INNODB

  MYSQL數(shù)據(jù)庫(kù)存文本轉(zhuǎn)存數(shù)據(jù)庫(kù)問(wèn)題

  一個(gè)mysql數(shù)據(jù)庫(kù),大約有1萬(wàn)記錄,當(dāng)初為了節(jié)省MYSQL數(shù)據(jù)庫(kù)空間,數(shù)據(jù)在存儲(chǔ)時(shí)其中一個(gè)字段存放文本。

  格式為下:

  ID title content ;

  1 電腦 /2010/0809/hfdsjfsdf.php

  2 網(wǎng)絡(luò) /2011/0101/ifrejfeor.php

  3 手機(jī) /2011/0202/bfvlbkflb.php

  10000 手表 /2011/0309/dfefiejwf.php

  在磁盤(pán)中,網(wǎng)站站點(diǎn)下,存在content對(duì)應(yīng)的目錄,里邊有N多PHP文件,PHP文件內(nèi)容為

  文章的內(nèi)容

  我現(xiàn)在不想讓數(shù)據(jù)存放文本,因?yàn)槲腋杏X(jué)存放文本的速度要比存放數(shù)據(jù)庫(kù)本身慢。我想將這些PHP中的內(nèi)容都導(dǎo)入到content中。

  方法:

  假設(shè)MYSQL和PHP在同一服務(wù)器上。在你的表中先加個(gè)newColOfPHPcode字段,需要足夠長(zhǎng)以容納PHP代碼。更新完后檢查一下,再刪除原來(lái)的CONTENT字段,并改名newColOfPHPcode為content;

  table1

  set newColOfPHPcode=LOAD_FILE(content)

  mysql-bin.000001文件的來(lái)源及處理方法

  用ports安裝了mysql以后,過(guò)一段時(shí)間發(fā)現(xiàn)/var空間不足了,查一下,會(huì)發(fā)現(xiàn)是mysql-bin.000001、mysql-bin.000002等文件占用了空間,那么這些文件是干嗎的?這是數(shù)據(jù)庫(kù)的操作日志,例如UPDATE一個(gè)表,或者DELETE一些數(shù)據(jù),即使該語(yǔ)句沒(méi)有匹配的數(shù)據(jù),這個(gè)命令也會(huì)存儲(chǔ)到日志文件中,還包括每個(gè)語(yǔ)句執(zhí)行的時(shí)間,也會(huì)記錄進(jìn)去的。

  這樣做主要有以下兩個(gè)目的:

  1:數(shù)據(jù)恢復(fù)

  如果你的數(shù)據(jù)庫(kù)出問(wèn)題了,而你之前有過(guò)備份,那么可以看日志文件,找出是哪個(gè)命令導(dǎo)致你的數(shù)據(jù)庫(kù)出問(wèn)題了,想辦法挽回?fù)p失。

  2:主從服務(wù)器之間同步數(shù)據(jù)

  主服務(wù)器上所有的操作都在記錄日志中,從服務(wù)器可以根據(jù)該日志來(lái)進(jìn)行,以確保兩個(gè)同步。

  處理方法分兩種情況:

  1:只有一個(gè)mysql服務(wù)器,那么可以簡(jiǎn)單的注釋掉這個(gè)選項(xiàng)就行了。

  vi /etc/my.cnf把里面的log-bin這一行注釋掉,重啟mysql服務(wù)即可。

  2:如果你的環(huán)境是主從服務(wù)器,那么就需要做以下操作了。

  A:在每個(gè)從屬服務(wù)器上,使用SHOW SLAVE STATUS來(lái)檢查它正在讀取哪個(gè)日志。

  B:使用SHOW MASTER LOGS獲得主服務(wù)器上的一系列日志。

  C:在所有的從屬服務(wù)器中判定最早的日志,這個(gè)是目標(biāo)日志,如果所有的從屬服務(wù)器是更新的,就是清單上的最后一個(gè)日志。

  D:清理所有的日志,但是不包括目標(biāo)日志,因?yàn)閺姆⻊?wù)器還要跟它同步。

  優(yōu)化SQL Server索引的小技巧

  SQL Server中有幾個(gè)可以讓你檢測(cè)、調(diào)整和優(yōu)化SQL Server性能的工具。在本文中,我將說(shuō)明如何用SQL Server的工具來(lái)優(yōu)化數(shù)據(jù)庫(kù)索引的使用,本文還涉及到有關(guān)索引的一般性知識(shí)。

  關(guān)于索引的常識(shí)

  影響到數(shù)據(jù)庫(kù)性能的最大因素就是索引。由于該問(wèn)題的復(fù)雜性,我只可能簡(jiǎn)單的談?wù)勥@個(gè)問(wèn)題,不過(guò)關(guān)于這方面的問(wèn)題,目前有好幾本不錯(cuò)的書(shū)籍可供你參閱。我在這里只討論兩種SQL Server索引,即clustered索引和nonclustered索引。當(dāng)考察建立什么類(lèi)型的索引時(shí),你應(yīng)當(dāng)考慮數(shù)據(jù)類(lèi)型和保存這些數(shù)據(jù)的column。同樣,你也必須考慮數(shù)據(jù)庫(kù)可能用到的查詢(xún)類(lèi)型以及使用的最為頻繁的查詢(xún)類(lèi)型。

  索引的類(lèi)型

  如果column保存了高度相關(guān)的數(shù)據(jù),并且常常被順序訪問(wèn)時(shí),最好使用clustered索引,這是因?yàn)槿绻褂胏lustered索引,SQL Server會(huì)在物理上按升序(默認(rèn))或者降序重排數(shù)據(jù)列,這樣就可以迅速的找到被查詢(xún)的數(shù)據(jù)。同樣,在搜尋控制在一定范圍內(nèi)的情況下,對(duì)這些column也最好使用clustered索引。這是因?yàn)橛捎谖锢砩现嘏艛?shù)據(jù),每個(gè)表格上只有一個(gè)clustered索引。

  與上面情況相反,如果columns包含的數(shù)據(jù)相關(guān)性較差,你可以使用nonculstered索引。你可以在一個(gè)表格中使用高達(dá)249個(gè)nonclustered索引——盡管我想象不出實(shí)際應(yīng)用場(chǎng)合會(huì)用的上這么多索引。

  當(dāng)表格使用主關(guān)鍵字(primary keys),默認(rèn)情況下SQL Server會(huì)自動(dòng)對(duì)包含該關(guān)鍵字的column(s)建立一個(gè)獨(dú)有的cluster索引。很顯然,對(duì)這些column(s)建立獨(dú)有索引意味著主關(guān)鍵字的唯一性。當(dāng)建立外關(guān)鍵字(foreign key)關(guān)系時(shí),如果你打算頻繁使用它,那么在外關(guān)鍵字cloumn上建立nonclustered索引不失為一個(gè)好的方法。如果表格有clustered索引,那么它用一個(gè)鏈表來(lái)維護(hù)數(shù)據(jù)頁(yè)之間的關(guān)系。相反,如果表格沒(méi)有clustered索引,SQL Server將在一個(gè)堆棧中保存數(shù)據(jù)頁(yè)。

  數(shù)據(jù)頁(yè)

  當(dāng)索引建立起來(lái)的時(shí)候,SQLServer就建立數(shù)據(jù)頁(yè)(datapage),數(shù)據(jù)頁(yè)是用以加速搜索的指針。當(dāng)索引建立起來(lái)的時(shí)候,其對(duì)應(yīng)的填充因子也即被設(shè)置。設(shè)置填充因子的目的是為了指示該索引中數(shù)據(jù)頁(yè)的百分比。隨著時(shí)間的推移,數(shù)據(jù)庫(kù)的更新會(huì)消耗掉已有的空閑空間,這就會(huì)導(dǎo)致頁(yè)被拆分。頁(yè)拆分的后果是降低了索引的性能,因而使用該索引的查詢(xún)會(huì)導(dǎo)致數(shù)據(jù)存儲(chǔ)的支離破碎。當(dāng)建立一個(gè)索引時(shí),該索引的填充因子即被設(shè)置好了,因此填充因子不能動(dòng)態(tài)維護(hù)。

  為了更新數(shù)據(jù)頁(yè)中的填充因子,我們可以停止舊有索引并重建索引,并重新設(shè)置填充因子(注意:這將影響到當(dāng)前數(shù)據(jù)庫(kù)的運(yùn)行,在重要場(chǎng)合請(qǐng)謹(jǐn)慎使用)。DBCC INDEXDEFRAG和DBCC DBREINDEX是清除clustered和nonculstered索引碎片的兩個(gè)命令。INDEXDEFRAG是一種在線操作(也就是說(shuō),它不會(huì)阻塞其它表格動(dòng)作,如查詢(xún)),而DBREINDEX則在物理上重建索引。在絕大多數(shù)情況下,重建索引可以更好的消除碎片,但是這個(gè)優(yōu)點(diǎn)是以阻塞當(dāng)前發(fā)生在該索引所在表格上其它動(dòng)作為代價(jià)換取來(lái)得。當(dāng)出現(xiàn)較大的碎片索引時(shí),INDEXDEFRAG會(huì)花上一段比較長(zhǎng)的時(shí)間,這是因?yàn)樵撁畹倪\(yùn)行是基于小的交互塊(transactional block)。

  填充因子

  當(dāng)你執(zhí)行上述措施中的任何一個(gè),數(shù)據(jù)庫(kù)引擎可以更有效的返回編入索引的數(shù)據(jù)。關(guān)于填充因子(fillfactor)話題已經(jīng)超出了本文的范疇,不過(guò)我還是提醒你需要注意那些打算使用填充因子建立索引的表格。

  在執(zhí)行查詢(xún)時(shí),SQL Server動(dòng)態(tài)選擇使用哪個(gè)索引。為此,SQL Server根據(jù)每個(gè)索引上分布在該關(guān)鍵字上的統(tǒng)計(jì)量來(lái)決定使用哪個(gè)索引。值得注意的是,經(jīng)過(guò)日常的數(shù)據(jù)庫(kù)活動(dòng)(如插入、刪除和更新表格),SQL Server用到的這些統(tǒng)計(jì)量可能已經(jīng)“過(guò)期了,需要更新。你可以通過(guò)執(zhí)行DBCC SHOWCONTIG來(lái)查看統(tǒng)計(jì)量的狀態(tài)。當(dāng)你認(rèn)為統(tǒng)計(jì)量已經(jīng)“過(guò)期時(shí),你可以執(zhí)行該表格的UPDATE STATISTICS命令,這樣SQL Server就刷新了關(guān)于該索引的信息了。

  建立數(shù)據(jù)庫(kù)維護(hù)計(jì)劃

  SQL Server提供了一種簡(jiǎn)化并自動(dòng)維護(hù)數(shù)據(jù)庫(kù)的工具。這個(gè)稱(chēng)之為數(shù)據(jù)庫(kù)維護(hù)計(jì)劃向?qū)В―atabase Maintenance Plan Wizard ,DMPW)的工具也包括了對(duì)索引的優(yōu)化。如果你運(yùn)行這個(gè)向?qū),你?huì)看到關(guān)于數(shù)據(jù)庫(kù)中關(guān)于索引的統(tǒng)計(jì)量,這些統(tǒng)計(jì)量作為日志工作并定時(shí)更新,這樣就減輕了手工重建索引所帶來(lái)的工作量。如果你不想自動(dòng)定期刷新索引統(tǒng)計(jì)量,你還可以在DMPW中選擇重新組織數(shù)據(jù)和數(shù)據(jù)頁(yè),這將停止舊有索引并按特定的填充因子重建索引。

【sql中的like語(yǔ)句詳解】相關(guān)文章:

oracle的sql語(yǔ)句01-21

SQL查詢(xún)語(yǔ)句大全10-24

SQL語(yǔ)句的理解原則10-05

SQL中的單記錄函數(shù)08-12

mysql SQL語(yǔ)句積累參考10-02

sql語(yǔ)句的各種模糊查詢(xún)08-25

SQL中的單記錄函數(shù)盤(pán)點(diǎn)09-09

PL/SQL編程中的經(jīng)驗(yàn)小結(jié)09-21

2016最新J2EE中SQL語(yǔ)句自動(dòng)構(gòu)造方法08-02

Oracle的sql語(yǔ)句模擬試題及答案10-12