## 一、建立適當的索引
高數據庫性能,索引是最物美價廉的東西了,不用加內存,不用改變調用sql,只要執行正確的create index 查詢速度就可能提高百倍千倍
## 二、添加索引
主鍵索引
當一張表中某個列設為主鍵的時候,則該列就是主鍵索引
create table aa(id int unsigned primary key auto_increment,
name varchar(32) )
這是id列是主鍵例
第一種 : 查詢索引 desc 表名 不能顯示索引的名字
第二種 : 查詢索引的show index from 表名
第三種 : 查詢索引的show keys from 表名、
如果你創建不表的時,沒有指定主鍵索引,也可以在創建表后,在添加指令
alter table 表名 add primary key(列名);
emp.frm 表的結構
emp.MYD 表的數據
emp.MYI 表的索引
普通索引
普通索引的創建,是先創建表,然后添加索引
create index 索引的名字 on 表名(列)
唯一索引
當變的某列指定為unique約束時,這列就是一個唯一索引
create table ddd(
id int primary key not null,
name varchar(100) unique
)
全文索引
全文索引、主要是針對文件、文本的檢索,全段索引對Myisam
錯誤的用法
select * from articles where body like '%mysql%'
正確的用法是
select * from articles where match(title,body) aginst('database')
說明
1.在mysql中fulltext索引指針對myisam生效
2.mysql自己提高的fulltest針對英文生效->sphinx(coreseek) 技術處理中文
3.使用方法是match(字段名) against(‘關鍵字’)
4.全文索引一個叫停止詞
刪除索引
alter table 表名 drop index 索引名
如果刪除主鍵索引
alter table 表名 drop primary key
修改索引
先刪除,在重新創建
為什么創建索引后速度會變快呢 BTree
## 三、 索引使用的注意事項
磁盤占用
對dml(update,delete,insert)語句的效率影響
頻繁操作的適合建立索引,字段非頻繁不適合建立索引,更新次數多的不適合建立索引
說明,如果我們的表中使用有復合索引(索引作用在多列上),此時我們
注意
1>對于創建得多列索引,只要查詢條件使用了最左邊的列,索引一段就會
被使用。
explain select * from dept where loc ="xxx"
2>對于使用like查詢,查詢如果是'%AA' 不會使用到索引‘aaa%’
會使用到索引
比如: explain select * from dept where dname like '%AAA'
不能使用 索引,既在like查詢時,關鍵字,最前面,不能使用%或則)_這樣
的字符,如果一定要前面有變化的值,則考慮使用全文檢索->sphinx
3>如果條件中有or 即使用其中有條件帶索引也不會使用,換言之,就是
要求使用所字段,都必須建立索引
id : 查詢序列號
select_type:查詢的類型
table:查詢的表名
type:掃描的方式
possible_keys:這個表中可能使用了哪些索引
key 實際使用了哪些索引
key_len:
ref
rows:掃描了多少行數,可能得到多少記錄
extra:sql語句額外信息,排序方式
索引的使用
查看索引的是使用情況
show status like 'Handler_read%';
大家可以注意
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數
handler_read_rnd_next:這個值越高,說明查詢低效
常用SQL優化
大批量插入數據(MySql管理員)
對于MyISAM
alter table table_name disable keys
loading dataa
alter table table_name enable keys;
對于Innodb
對于
1.將到導入的數據按照主鍵排序
2.set unique_checks= 0,關閉唯一性校驗
3. set autocommit = 0,關閉自動提交
sql語句的小技巧
1> 在使用group by 分組查詢,默認分組后,還會排序,可能會降低速度
2> 在group by 后面添加order by null 就不會排序
3> 在有些情況下,可以使用連接代替子查詢,因為使用join MySql不需要在內存中
創建臨臨時表
select * from dept,emp where dept.deptno = emp.deptno
select * from dept left join emp on dept.deptno = emp.deptno
選擇合適的存儲引擎
myIsam 存儲,如果表對事物要求不高,同時是以查詢和添加為主的,我們考慮使用
myisan存儲引擎
INNODB 存儲,對事物要求高,保存的數據都是重要數據
memory: 存儲,比如我們數據變法頻繁,不需要入庫,同時又頻繁查詢和修改,我們考試
使用memory
myisam innodb
批量插入的速度 高 低
事物安全 支持
全文索引 支持
鎖機制 表鎖 行鎖
存儲限制 沒有 64TB
B數索引 沒有 支持
哈希索引 支持
集群索引 支持
數據緩存 支持 支持
索引緩存 支持
數據可壓縮 支持
空時使用 低 高
內存使用 低 高
支持外鍵
MyISaM 與 innodb
1.事物安全
2.查詢和添加速度
3.支持全文索引
4.鎖機制
5.外鍵MyISAM不支持外鍵
MyISaM刪除數據文件變小
optimize table 表名
定時維護