新聞中心
Mysql大表加索引
select (*) from tb_name where create_time xxx;
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),東港企業(yè)網(wǎng)站建設(shè),東港品牌網(wǎng)站建設(shè),網(wǎng)站定制,東港網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,東港網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
最終得知是因為這個表數(shù)據(jù)行數(shù)已經(jīng)超過 一千萬了,然后create_time字段又沒有索引 。
那解決辦法肯定是加索引嘍。
但是這個表是一直在線上運行,很重要和業(yè)務(wù)部分。如果給千萬級的大表在線加索引 ,肯定會卡死。
然后就搜羅了一大筐解決方案,比如 在線無鎖加索引使用
ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE;
后來才發(fā)現(xiàn),這個特性是 Mysql 5.6 以后才支持,然而我們的mysql用的是5.5版本
最后在 《高性能Mysql》一書中看到,可在通過 “影子拷貝”來解決,
就是 先創(chuàng)建一張和源表無關(guān)的新表,然后通過重命名和刪表操作交換兩張表;
當(dāng)給新表加完索引后,最上面那條查詢直接就是0.0002s
場景:在給一張有幾萬條記錄的表添加索引時,進度非常慢,導(dǎo)致其它查詢無法進行
處理方式:
使用Navicat的命令行模式,執(zhí)行以下命令:
show processlist;
這時會看到有哪些線程正在執(zhí)行,也可以查看鎖表的線程。你會發(fā)現(xiàn)alter table * add key ****那個線程狀態(tài)是Waiting for table metadata lock,后面有個這個表的所有操作都是這個狀態(tài),很明顯是這條加索引的語句把表給鎖了。
查看線程ID,執(zhí)行
kill 線程ID
這樣被鎖住的表就能立即被使用了。
由此得出一個結(jié)論,當(dāng)一張表數(shù)據(jù)量很大時,不要輕易添加索引,會導(dǎo)致表被鎖死!如果非要添加,那么應(yīng)該先把數(shù)據(jù)表進行備份,然后進行空表添加索引。
只能通過ALTER TABLE不能create index
參數(shù)說明:
MYSQL如何添加索引
1.添加PRIMARY KEY(主鍵索引) mysqlALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysqlALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) mysqlALTER TABLE `table_name` ADD FULLTEXT ( `column`) 5.添加多列索引 mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
MYSQL創(chuàng)建表的時候如何加“索引”?
兄弟,primary key是主鍵,每個表只能有一個主鍵,而且數(shù)據(jù)是唯一的。\x0d\x0a可以這樣寫:\x0d\x0aCREATE TABLE IF NOT EXISTS `".$ctb_name."` (\x0d\x0a `id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,\x0d\x0a `keyid` VARCHAR(20) NOT NULL,\x0d\x0a `key` VARCHAR(20) NOT NULL,\x0d\x0a `stauts` BOOL NOT NULL DEFAULT'0',\x0d\x0aindex `idx_status`(`status`)\x0d\x0a )ENGINE = MYISAM DEFAULT CHARSET=utf8;\x0d\x0a不過,status是bool類型的字段,只有true和false,區(qū)分度太低,沒有必要加索引。\x0d\x0a\x0d\x0a索引目的是為了使查詢更快,區(qū)分度小的時候不如全表掃描。
分享名稱:mysql過億的表怎么加索引 mysql 100萬數(shù)據(jù)加索引
分享網(wǎng)址:http://fisionsoft.com.cn/article/doidjcj.html