mysql索引使增删变慢_mysql优化(四)–索引
http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html
一、 四種索引類型:
主鍵索引,唯一索引,全文索引,普通索引
二、 ?為什么建立索引比較快
一般的數據表是按照行來存儲的,字段多、有長字段的表的記錄就會長,就要占用更多的空間來存儲,而索引是建立在一個或少數幾個字段上的特殊數據結構,一個索引項的存儲開銷和表的記錄相比是很小的。
所謂查詢速度更快,其實發生在計算機內部的動作有三大步驟,即輸入、處理和輸出,完成整套動作之后,你才能體會到快慢,而在這三個動作中,輸入通常就是從硬盤上裝載數據到內存,它耗時最甚,那么讀取索引和讀取表的全部行的數據量差異就大大影響最終性能。另外,索引是排好序的,能夠實施二分查找算法,比其行掃描(讀取表的所有記錄,逐行判斷是否滿足條件)這種順序查找算法來說,效率提升也以數量級計。
三、 各種索引的增刪查改
3.1?增加
3.1.1?主鍵索引添加
當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引
create table aaa
(id int unsigned primary key auto_increment ,
name varchar(32) not null defaul ‘’);
這是id 列就是主鍵索引.
如果你創建表時,沒有指定主鍵索引,也可以在創建表后,在添加, 指令:
alter table 表名 add primary key (列名);
舉例:
create table bbb (id int , name varchar(32) not null default ‘’);
alter table bbb add primary key (id);
3.1.2?普通索引
一般來說,普通索引的創建,是先創建表,然后在創建普通索引
比如:
create table ccc(
id int unsigned,
name varchar(32)
)
create index 索引名 on 表 (列1,列名2);
3.1.3 全文索引
全文索引,主要是針對文件,文本的檢索, 比如文章, 全文索引針對MyISAM有用.
創建 :
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
)engine=myisam charset utf8;
如何使用全文索引:
錯誤用法:
select * from articles where body like ‘%mysql%’; 【不會使用到全文索引】
mysql> explain select * from articles where body like ‘mysql%’\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: articles
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
Extra: Using where
1 row in set (0.00 sec)
證明:
explain? select * from articles where body like ‘%mysql%’
正確的用法是:
select * from articles where match(title,body) against(‘database’); 【可以】
mysql> explain select * from articles where match(title,body) against ( ‘mysql’)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: articles
type: fulltext
possible_keys: title
key: title
key_len: 0
ref: NULL
rows: 1
Extra: Using where
1 row in set (0.00 sec)
? 說明:
在mysql中fulltext 索引只針對 myisam生效
mysql自己提供的fulltext針對英文生效->sphinx (coreseek) 技術處理中文
使用方法是 match(字段名..) against(‘關鍵字’)
全文索引:停止詞, 因為在一個文本中,創建索引是一個無窮大的數,因此,對一些常用詞和字符,就不會創建,這些詞,稱為停止詞.比如(a,b,mysql,the)
3.1.4?唯一索引
①當表的某列被指定為unique約束時,這列就是一個唯一索引
create table ddd(id int primary key auto_increment , name varchar(32) unique);
這時, name 列就是一個唯一索引.
unique字段可以為NULL,并可以有多NULL, 但是如果是具體內容,則不能重復,
但是不能存有重復的空字符串’’
主鍵字段,不能為NULL,也不能重復.
②在創建表后,再去創建唯一索引
create table eee(id int primary key auto_increment, name varchar(32));
create unique index 索引名? on 表名 (列表..);
3.2 索引查詢
desc 表名 【該方法的缺點是: 不能夠顯示索引名.】
show index(es) from 表名
show keys from 表名
3.3 索引刪除
alter table 表名 drop index 索引名;
如果刪除主鍵索引。
alter table 表名 drop primary key
3.4 修改索引
先刪除索引再重新創建索引
四、索引的代價
占用磁盤空間、使得dml 增刪改操作變慢。索引主要用于查操作變快。
五、哪些列上適合加索引
5.1 較頻繁的作為查詢條件的字段應該創建索引
5.2 唯一性太差的字段不適合創建索引
5.3 更新非常頻繁的字段不適合創建索引
5.4 不會出現在where字句中的字段不適合創建索引
總結: 滿足以下條件的字段,才應該創建索引.
a: 肯定在where條件經常使用 b: 該字段的內容不是唯一的幾個值(sex) c: 字段內容不是頻繁變化.
六、查看索引的使用情況
如果索引正在工作,Handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數,很低的值表明增加索引得到的性能改善不高,因為索引并不經常使用。
Handler_read_rnd_next的值高則意味著查詢運行低效,并且應該建立索引補救。這個值的含義是在數據文件中讀下一行的請求數。如果你正進行大量的表掃描,該值較高。通常說明表索引不正確或寫入的查詢沒有利用索引。
語法:? ? mysql> show status like ‘Handler_read%';
七、使用索引的幾個注意點
7.1??對于創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。如果只使用右邊的列,索引不會被使用。
7.2?對于使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引?!產aa%’ 會使用到索引。在like查詢時,關鍵的 ‘關鍵字’ , 最前面,不能使用 % 或者 _這樣的字符., 如果一定要前面有變化的值,則考慮使用 全文索引->sphinx.
7.3??如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有字段,都必須建立索引, 我們建議大家盡量避免使用or 關鍵字
7.4 ?如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則不使用索引。(添加時,字符串必須’’), 也就是,如果列是字符串類型,就一定要用 ‘’ 把他包括起來.
7.5 ?如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
八、 如何選擇mysql的存儲引擎
8.1 在開發中,我們經常使用的存儲引擎 myisam / innodb/ memory
myisam 存儲: 如果表對事務要求不高,同時是以查詢和添加為主的,我們考慮使用myisam存儲引擎. ,比如 bbs 中的 發帖表,回復表.
INNODB 存儲: 對事務要求高,保存的數據都是重要數據,我們建議使用INNODB,比如訂單表,賬號表.
8.2 MyISAM 和 INNODB的區別
事務安全(MyISAM不支持事務,INNODB支持事務)
查詢和添加速度(MyISAM批量插入速度快)
支持全文索引(MyISAM支持全文索引,INNODB不支持全文索引)
鎖機制(MyISAM時表鎖,innodb是行鎖)
外鍵 MyISAM 不支持外鍵, INNODB支持外鍵. (在PHP開發中,通常不設置外鍵,通常是在程序中保證數據的一致)
Memory 存儲,比如我們數據變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用memory, 速度極快. (如果mysql重啟的話,數據就不存在了)
如果你的數據庫的存儲引擎是myisam,請一定記住要定時進行碎片整理,因為在myisam引擎中,如果刪除數據,空間不會被回收,索引你會發現雖然數據刪除很多,但是空間占用依然很厲害,索引需要使用optimize語句進行空間的回收整理。
總結
以上是生活随笔為你收集整理的mysql索引使增删变慢_mysql优化(四)–索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: div不继承父类样式_Python编程思
- 下一篇: 苹果企业证书_苹果签名经常掉签原因大汇总