真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么破壞索引 mysql破壞索引的sql語句寫法

怎么損壞mysql數(shù)據(jù)表的索引

損壞mysql數(shù)據(jù)表的索引

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

mysql表索引被破壞的問題及解決

下午上班,驚聞我的dedecms的網(wǎng)站出問題了,訪問一看,果然全屏報(bào)錯(cuò),檢查mysql日志,錯(cuò)誤信息為:

Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired

提示說cms的文章表dede_archives被標(biāo)記有問題,需要修復(fù)。于是趕快恢復(fù)歷史數(shù)據(jù),上網(wǎng)查找原因。最終將問題解決。解決方法如下:

找到mysql的安裝目錄的bin/myisamchk工具,在命令行中輸入:

myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI

然后myisamchk 工具會(huì)幫助你恢復(fù)數(shù)據(jù)表的索引。重新啟動(dòng)mysql,問題解決。

問題分析:

1、錯(cuò)誤產(chǎn)生原因,有網(wǎng)友說是頻繁查詢和更新dede_archives表造成的索引錯(cuò)誤,因?yàn)槲业捻撁鏇]有靜態(tài)生成,而是動(dòng)態(tài)頁面,因此比較同意

這種說法。還有說法為是MYSQL數(shù)據(jù)庫因?yàn)槟撤N原因而受到了損壞,如:數(shù)據(jù)庫服務(wù)器突發(fā)性的斷電、在提在數(shù)據(jù)庫表提供服務(wù)時(shí)對(duì)表的原文件

進(jìn)行某種操作都有可能導(dǎo)致MYSQL數(shù)據(jù)庫表被損壞而無法讀取數(shù)據(jù)??傊褪且?yàn)槟承┎豢蓽y(cè)的問題造成表的損壞。

2、問題解決辦法。

當(dāng)你試圖修復(fù)一個(gè)被破壞的表的問題時(shí),有三種修復(fù)類型。如果你得到一個(gè)錯(cuò)誤信息指出一個(gè)臨時(shí)文件不能建立,刪除信息所指出的文件并再

試一次--這通常是上一次修復(fù)操作遺留下來的。

這三種修復(fù)方法如下所示:

% myisamchk --recover --quick /path/to/tblName

% myisamchk --recover /path/to/tblName

% myisamchk --safe-recover /path/to/tblName

第一種是最快的,用來修復(fù)最普通的問題;而最后一種是最慢的,用來修復(fù)一些其它方法所不能修復(fù)的問題。

檢查和修復(fù)MySQL數(shù)據(jù)文件

如果上面的方法無法修復(fù)一個(gè)被損壞的表,在你放棄之前,你還可以試試下面這兩個(gè)技巧:

如果你懷疑表的索引文件(*.MYI)發(fā)生了不可修復(fù)的錯(cuò)誤,甚至是丟失了這個(gè)文件,你可以使用數(shù)據(jù)文件(*.MYD)和數(shù)據(jù)格式文件(*.frm)重新生

成它。首先制作一個(gè)數(shù)據(jù)文件(tblName.MYD)的拷貝。重啟你的MySQL服務(wù)并連接到這個(gè)服務(wù)上,使用下面的命令刪除表的內(nèi)容:

mysql DELETE FROM tblName;

在刪除表的內(nèi)容的同時(shí),會(huì)建立一個(gè)新的索引文件。退出登錄并重新關(guān)閉服務(wù),然后用你剛才保存的數(shù)據(jù)文件(tblName.MYD)覆蓋新的(空)數(shù)據(jù)

文件。最后,使用myisamchk執(zhí)行標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法),根據(jù)表的數(shù)據(jù)的內(nèi)容和表的格式文件重新生成索引數(shù)據(jù)。

如果你的表的格式文件(tblName.frm)丟失了或者是發(fā)生了不可修復(fù)的錯(cuò)誤,但是你清楚如何使用相應(yīng)的CREATE

TABLE語句來重新生成這張表,你可以重新生成一個(gè)新的.frm文件并和你的數(shù)據(jù)文件和索引文件(如果索引文件有問題,使用上面的方法重建一

個(gè)新的)一起使用。首先制作一個(gè)數(shù)據(jù)和索引文件的拷貝,然后刪除原來的文件(刪除數(shù)據(jù)目錄下有關(guān)這個(gè)表的所有記錄)。

啟動(dòng)MySQL服務(wù)并使用當(dāng)初的CREATE

TABLE文件建立一個(gè)新的表。新的.frm文件應(yīng)該可以正常工作了,但是最好你還是執(zhí)行一下標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法)。

3、myisamchk工具介紹(見mysql的官方手冊(cè))

可以使用myisamchk實(shí)用程序來獲得有關(guān)數(shù)據(jù)庫表的信息或檢查、修復(fù)、優(yōu)化他們。myisamchk適用MyISAM表(對(duì)應(yīng).MYI和.MYD文件的表)。

調(diào)用myisamchk的方法:

shell myisamchk [options] tbl_name ...

options指定你想讓myisamchk做什么。在后面描述它們。還可以通過調(diào)用myisamchk --help得到選項(xiàng)列表。

tbl_name是你想要檢查或修復(fù)的數(shù)據(jù)庫表。如果你不在數(shù)據(jù)庫目錄的某處運(yùn)行myisamchk,你必須指定數(shù)據(jù)庫目錄的路徑,因?yàn)閙yisamchk不知

道你的數(shù)據(jù)庫位于哪兒。實(shí)際上,myisamchk不在乎你正在操作的文件是否位于一個(gè)數(shù)據(jù)庫目錄;你可以將對(duì)應(yīng)于數(shù)據(jù)庫表的文件拷貝到別處并

且在那里執(zhí)行恢復(fù)操作。

如果你愿意,可以用myisamchk命令行命名幾個(gè)表。還可以通過命名索引文件(用“

.MYI”后綴)來指定一個(gè)表。它允許你通過使用模式“*.MYI”指定在一個(gè)目錄所有的表。例如,如果你在數(shù)據(jù)庫目錄,可以這樣在目錄下檢查

所有的MyISAM表:

shell myisamchk *.MYI

如果你不在數(shù)據(jù)庫目錄下,可通過指定到目錄的路徑檢查所有在那里的表:

shell myisamchk /path/to/database_dir*.MYI

MySQL索引機(jī)制(詳細(xì)+原理+解析)

MySQL 前綴索引能有效減小索引文件的大小,提高索引的速度。但是前綴索引也有它的壞處:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前綴索引,也不能把它們用作覆蓋索引(Covering Index)。

集一個(gè)索引包含多個(gè)列(最左前綴匹配原則)

索引列的值必須唯一,但允許有空值

全文索引為FUllText,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復(fù)值和空值,全文索引可以在CHAR,VARCHAR,TEXT類型列上創(chuàng)建

設(shè)定主鍵后數(shù)據(jù)會(huì)自動(dòng)建立索引,InnoDB為聚簇索引

即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引

覆蓋索引是指一個(gè)查詢語句的執(zhí)行只用從所有就能夠得到,不必從數(shù)據(jù)表中讀取,覆蓋索引不是索引樹,是一個(gè)結(jié)果,當(dāng)一條查詢語句符合覆蓋索引條件時(shí)候,MySQL只需要通過索引就可以返回查詢所需要的數(shù)據(jù),這樣避免了查到索引后的回表操作,減少了I/O效率

查看索引

列名解析:

刪除索引

查看:

刪除前:

刪除后:

普通的索引,沒有什么介紹

查看:(注意和前綴索引Sub_part的區(qū)別)

當(dāng)索引的列是unique的時(shí)候,會(huì)生成唯一索引,唯一索引關(guān)于null有下列兩種情況

SQLSERVER 下的唯一索引的列,允許null值,但最多允許有一個(gè)空值

MYSQL下的唯一索引的列,允許null值,并且允許多個(gè)空值

查看:

會(huì)建立兩個(gè)索引,一個(gè)非聚簇索引,一個(gè)是唯一索引

結(jié)果:

可以插入兩個(gè)空值(明人不說暗話,我喜歡MySQL)

一方面,它不會(huì)索引所有字段所有字符,會(huì)減小索引樹的大小.

另外一方面,索引只是為了區(qū)別出值,對(duì)于某些列,可能前幾位區(qū)別很大,我們就可以使用前綴索引。

一般情況下某個(gè)前綴的選擇性也是足夠高的,足以滿足查詢性能。對(duì)于BLOB,TEXT,或者很長(zhǎng)的VARCHAR類型的列,必須使用前綴索引,因?yàn)镸ySQL不允許索引這些列的完整長(zhǎng)度。

查看:

查看:

復(fù)合索引的最左前綴匹配原則 :

對(duì)于復(fù)合索引,查詢?cè)谝欢l件才會(huì)使用該索引

減少開銷。 建一個(gè)聯(lián)合索引(col1,col2,col3),實(shí)際相當(dāng)于建了(col1),(col1,col2),(col1,col2,col3)三個(gè)索引。每多一個(gè)索引,都會(huì)增加寫操作的開銷和磁盤空間的開銷。對(duì)于大量數(shù)據(jù)的表,使用聯(lián)合索引會(huì)大大的減少開銷!

覆蓋索引。 對(duì)聯(lián)合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通過遍歷索引取得數(shù)據(jù),而無需回表,這減少了很多的隨機(jī)io操作。減少io操作,特別的隨機(jī)io其實(shí)是dba主要的優(yōu)化策略。所以,在真正的實(shí)際應(yīng)用中,覆蓋索引是主要的提升性能的優(yōu)化手段之一。

效率高。 索引列越多,通過索引篩選出的數(shù)據(jù)越少。有1000W條數(shù)據(jù)的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假設(shè)假設(shè)每個(gè)條件可以篩選出10%的數(shù)據(jù),如果只有單值索引,那么通過該索引能篩選出1000W10%=100w條數(shù)據(jù),然后再回表從100w條數(shù)據(jù)中找到符合col2=2 and col3= 3的數(shù)據(jù),然后再排序,再分頁;如果是聯(lián)合索引,通過索引篩選出1000w10% 10% *10%=1w。

在模糊搜索中很有效,搜索全文中的某一個(gè)字段,可以參考這篇博文

:

我們先進(jìn)行下面一個(gè)實(shí)驗(yàn)看看InnoDB下的主鍵索引的一個(gè)現(xiàn)象。

查看:

我們插入進(jìn)去的時(shí)候,數(shù)據(jù)的id都是亂序的,為什么這里最后select查詢出來的結(jié)果都是進(jìn)行了排序?

這是因?yàn)镮nnoDB索引底層實(shí)現(xiàn)的是B+tree,B+tree具有下列的特點(diǎn):

所以上面的排序是為了使用B+tree的結(jié)構(gòu) ,B+tree為了范圍搜索,將主鍵按照從小到大排序后,拆分成節(jié)點(diǎn)。后續(xù)還有新的節(jié)點(diǎn)進(jìn)入的時(shí)候,和B-tree相同的操作,會(huì)進(jìn)行分裂。

一般來說,聚簇索引的B+tree都是三層

InnoDB中主鍵索引一定是聚簇索引,聚簇索引一定是主鍵索引。

為什么這里輔助索引葉子結(jié)點(diǎn)不直接存儲(chǔ)數(shù)據(jù)呢?

MYISAM只有非聚簇索引,索引最終指向的都是物理地址。

Q:既然有回表的存在,那么聚簇索引的優(yōu)勢(shì)在哪里?

Q:主鍵索引作為聚簇索引需要注意什么

在查詢語句中使用LIke關(guān)鍵字進(jìn)行查詢時(shí),如果匹配字符串的第一個(gè)字符為"%",索引不會(huì)使用。如果“%”不是在第一位,索引就會(huì)使用

多列索引是在表的多個(gè)字段上創(chuàng)建的索引,滿足最左前綴匹配原則,索引才會(huì)被使用

查詢語句只有Or關(guān)鍵字時(shí)候,如果OR前后的兩個(gè)條件都是索引,這這次查詢將會(huì)使用索引,否則Or前后有一個(gè)條件的列不是索引,那么查詢中將不使用索引

mysql 索引失效的原因有哪些

1.索引無法存儲(chǔ)null值

a.單列索引無法儲(chǔ)null值,復(fù)合索引無法儲(chǔ)全為null的值。

b.查詢時(shí),采用is null條件時(shí),不能利用到索引,只能全表掃描。

為什么索引列無法存儲(chǔ)Null值?

a.索引是有序的。NULL值進(jìn)入索引時(shí),無法確定其應(yīng)該放在哪里。(將索引列值進(jìn)行建樹,其中必然涉及到諸多的比較操作,null 值是不確定值無法

比較,無法確定null出現(xiàn)在索引樹的葉子節(jié)點(diǎn)位置。) 

b.如果需要把空值存入索引,方法有二:其一,把NULL值轉(zhuǎn)為一個(gè)特定的值,在WHERE中檢索時(shí),用該特定值查找。其二,建立一個(gè)復(fù)合索引。例如 

create index ind_a on table(col1,1); 通過在復(fù)合索引中指定一個(gè)非空常量值,而使構(gòu)成索引的列的組合中,不可能出現(xiàn)全空值?!?/p>

2.不適合鍵值較少的列(重復(fù)數(shù)據(jù)較多的列)

假如索引列TYPE有5個(gè)鍵值,如果有1萬條數(shù)據(jù),那么 WHERE TYPE = 1將訪問表中的2000個(gè)數(shù)據(jù)塊。

再加上訪問索引塊,一共要訪問大于200個(gè)的數(shù)據(jù)塊。

如果全表掃描,假設(shè)10條數(shù)據(jù)一個(gè)數(shù)據(jù)塊,那么只需訪問1000個(gè)數(shù)據(jù)塊,既然全表掃描訪問的數(shù)據(jù)塊

少一些,肯定就不會(huì)利用索引了。

3.前導(dǎo)模糊查詢不能利用索引(like '%XX'或者like '%XX%')

假如有這樣一列code的值為'AAA','AAB','BAA','BAB' ,如果where code like '%AB'條件,由于前面是

模糊的,所以不能利用索引的順序,必須一個(gè)個(gè)去找,看是否滿足條件。這樣會(huì)導(dǎo)致全索引掃描或者全表掃

描。如果是這樣的條件where code like 'A % ',就可以查找CODE中A開頭的CODE的位置,當(dāng)碰到B開頭的

數(shù)據(jù)時(shí),就可以停止查找了,因?yàn)楹竺娴臄?shù)據(jù)一定不滿足要求。這樣就可以利用索引了。

4.索引失效的幾種情況

1.如果條件中有or,即使其中有條件帶索引也不會(huì)使用(這也是為什么盡量少用or的原因)

要想使用or,又想讓索引生效,只能將or條件中的每個(gè)列都加上索引

2.對(duì)于多列索引,不是使用的第一部分,則不會(huì)使用索引

3.like查詢以%開頭

4.如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來,否則不使用索引

5.如果mysql估計(jì)使用全表掃描要比使用索引快,則不使用索引

5.MySQL主要提供2種方式的索引:B-Tree索引,Hash索引

B樹索引具有范圍查找和前綴查找的能力,對(duì)于有N節(jié)點(diǎn)的B樹,檢索一條記錄的復(fù)雜度為O(LogN)。相當(dāng)于二分查找。

哈希索引只能做等于查找,但是無論多大的Hash表,查找復(fù)雜度都是O(1)。

顯然,如果值的差異性大,并且以等值查找(=、 、in)為主,Hash索引是更高效的選擇,它有O(1)的查找復(fù)雜度。

如果值的差異性相對(duì)較差,并且以范圍查找為主,B樹是更好的選擇,它支持范圍查找。

from

怎么在數(shù)據(jù)庫中刪除已經(jīng)添加的某個(gè)索引

刪除索引可以使用ALTER TABLE或DROP INDEX語句來實(shí)現(xiàn),DROP INDEX可以在ALTER TABLE內(nèi)部作為一條語句處理,其格式如下:

DROP INDEX index_name?ON?talbe_name

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

注:其中,前兩條語句是等價(jià)的,刪除掉table_name中的索引index_name。

擴(kuò)展資料:

索引的使用及注意事項(xiàng)?

EXPLAIN可以幫助開發(fā)人員分析SQL問題,explain顯示了mysql如何使用索引來處理select語句以及連接表,可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語句。

使用方法,在select語句前加上Explain就可以了:Explain select * from user where id=1;

盡量避免這些不走索引的sql:

SELECT `sname` FROM `stu` WHERE `age`+10=30;-- 不會(huì)使用索引,因?yàn)樗兴饕袇⑴c了計(jì)算

SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) 1990; -- 不會(huì)使用索引,因?yàn)槭褂昧撕瘮?shù)運(yùn)算,原理與上面相同

SELECT * FROM `houdunwang` WHERE `uname` LIKE'后盾%' 走索引

SELECT * FROM `houdunwang` WHERE `uname` LIKE "%后盾%" 不走索引

正則表達(dá)式不使用索引,這應(yīng)該很好理解,所以為什么在SQL中很難看到regexp關(guān)鍵字的原因。

字符串與數(shù)字比較不使用索引;

CREATE TABLE `a` (`a` char(10));

EXPLAIN SELECT * FROM `a` WHERE `a`="1" 走索引

EXPLAIN SELECT * FROM `a` WHERE `a`=1 不走索引


本文名稱:mysql怎么破壞索引 mysql破壞索引的sql語句寫法
文章出自:http://weahome.cn/article/doeppsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部