mysql索引

数据库索引

普通索引index
唯一索引
    主键索引:primary key 
    唯一索引:unique
联合索引
    primary key (key1,key2)
    unique(key1,key2)
    index(key1,key2)
    
全文索引
    fulltextindex: 长篇的文字进行快速的查找



索引的类型:
hash: 单条查询快,范围查询慢
btree:层数越多,数据量越大;


引擎&索引的类型
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;


char : 固定的长度
varchar:长度可变--- 65535  (内容头会有1到2个字节, 如果编码为utf8,1个字符3个字节)
text:文本较长的时候
查询的速度char > varchar > text



sql优化    
join来替代sub-select;
select column 限定column是我们需要的
select count(*) 改为count(1) or count(columnName)
如果条件查询的考虑建立多个点列索引;
join的时候类型一致


索引的测试 来自runoob 进行改动
CREATE TABLE Websites (
	id INT,
	NAME VARCHAR (20),
	url VARCHAR (50),
	alexa INT,
	country VARCHAR (10)
);
insert into websites(id,name,url,alexa,country) values(1,'Google','https://www.google.com/',1,'USA');
insert into websites(id,name,url,alexa,country) values(2,'淘宝','https://www.taobao.com/',1,'CN');
insert into websites(id,name,url,alexa,country) values(3,'菜鸟教程','https://www.runoob.com/',4689,'CN');
insert into websites(id,name,url,alexa,country) values(4,'微博','https://weibo.com/',1,'CN');
insert into websites(id,name,url,alexa,country) values(5,'FaceBook','https://www.facebook.com/',1,'USA');

建立索引
-- 创建普通索引
-- create index alexa on websites(alexa);

-- 创建唯一索引 name 建立唯一的所有,字段进行唯一的区分不可以有重复的值
-- create unique index name on websites(name);

-- 创建普通联合索引
-- create index alexa2 on websites(alexa,country);

删除索引
drop index name on websites;


explain 解释的使用
explain SELECT * from websites where `NAME`='淘宝';
id,select_type,table,type,possible_keys,key,key_len,ref,rows,extra
1	SIMPLE	websites	const	name	name	63	const	1	

id: 查询的记录的id ,区分不同的查,id越大优先级越高

select_type: 查询的类型 

table : 使用的表

type: 访问类型 all,index,range,ref,eq_ref,const,system,null(性能差---->好)
    all : full table scan
    index:全文索引, 使用一个索引进行查询
    range: 范围所有,使用一个索引俩进行查询
    ref: 列或常量被用来查询索引上的值
    eq_ref: 使用唯一索引
    const,system: 变量转换为一个长量的时候,如果只有一行就为system
    

possible_keys: 使用哪个所有进行查询

key: 必须在possible_keys中

key_len: 索引中使用的字节长度

ref: 常量用于索引的查询

rows :  估算的结果集

extra: 过滤的类型 gourp by order by,


慢查询的优化
是否执行缓慢,设置sql_no_cache
查看哪个where条件的区分度高  (根据那个条件过滤的记录数量大)
执行explain 分析是否符合区分度
order by, limit 让排序的表优先
合理使用索引

索引失效的情况:
like 百分号打头
使用or语句的前后
不是组合索引的第一列
varchar的索引 没有加引号
is null , is not null
!= <>
使用函数