Mysql执行计划分析记录
explain SELECT * FROM `users`
--走主键索引
explain SELECT id FROM `users`
int是4byte
--or没有走索引
explain SELECT id FROM `users` where id=1 or UserName="boom"
id是主键,肯定是索引
UserName普通字段,硬盘中
1.走索引--目录,扫描少量的硬盘拿到数据-得到结果
2.只能全部扫描硬盘
3,第一步和第二步的结果合并,得出最终结果
二合一,直接全部扫描硬盘,一次性把数据查询。。all
有没有优化空间,如果在没有不加索引的情况下,没有任何优化空间
如果要优化,必须加索引
alter table users add INDEX idx_username(UserName)
建立了or前后的索引,但是用了or,会走索引,本身和mysql有关了
explain SELECT id FROM `users` where id=1 or UserName="boom"
--
EXPLAIN SELECT * from users where id=1
UNION
SELECT * from users where UserName='boom'
drop INDEX idx_username
#对于复合索引,是索引全部扫描了查询速度快呢,还是索引字段部分查询,速度比较快
#根据不同的sql语言分析
alter table users_copy1 add INDEX idx_PU(Password,UserName)
--如果查询条件只有复合索引的一半,则只走一半索引
EXPLAIN SELECT * FROM users_copy1 where PASSWORD ='1' and UserName ='boom'
---实战,分页
1,所有数据排序,这个地方非常耗性能
2,排序后,我需要在排序之后的数据,获取需要的数据
-有没有办法,
1.where 过滤,id,id是自增的
SELECT id from users_copy1 order by id LIMIT 1000,10
创建主键的时候不要使用uuid,占资源,解决分页
create table userInfo(
id int(11) not null,
name varchar(100),
PRIMARY key(id)
)
INSERT into userInfo VALUES(1,'aaaaaaaa'),(2,'bbbbbbbbbbbbbbbbb'),(3,'cccccc')
EXPLAIN SELECT * from userInfo #不走
EXPLAIN SELECT * from userInfo where id='1' #走索引
alter table userInfo add index idx_name(name) #name加索引
EXPLAIN SELECT * from userInfo #走name索引,原因:因为数据库全部字段都有了索引
ALTER TABLE userInfo ADD COLUMN mark varchar(100) #加一个字段
EXPLAIN SELECT * from userInfo #不走索引,原因:因为数据库并非全部字段都有了索引
EXPLAIN SELECT * from userInfo where name like '%a%' #不走
EXPLAIN SELECT * from userInfo where name like 'a%' #走
EXPLAIN SELECT * from userInfo where name like '%a' #走
key_len判断是否走全部索引,比如int(4)+name(20)--现在得到的是4,只走了部分索引
system--const--ref--range--index-all
系统变量--系统常量--常量慢一些--内存范围,索引的范围,只需要查询部分索引,就可以查询--硬盘
1 select * 到底有啥不好,
1)写法不规范
2)流量的问题,如果你的业务不是需要所有的字段,会查询出没有必要的字段
3)索引的覆盖和索引回表的字段
3.1)如果你查询的字段是索引(数据可以直接从内存中获取)
3.2)尽量写自己需要查询的字段,如果写需要字段,把索引创建好的话,可能就查询一次,
如果你写了*,可能会导致查询多次。