## 一、建立适当的索引
高数据库性能,索引是最物美价廉的东西了,不用加内存,不用改变调用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 表名
定时维护