mysql详解13:索引

索引:存储在磁盘中
影响性能

创建索引
EXPLAIN select * from student where state ="CA";//查询并查看扫描的条数
create INDEX idx_state on student(state); //在该字段上创建索引 再查询
创建索引后再查询 扫描的条数减少

查看索引
ANALYZE TABLE customers; //可以让索引的统计值不再是估值,更加准确
show INDEX in student;
二级索引
主键和外键都会自动创建索引

前置索引:只包含列的前几个字母或者列前缀
CREATE INDEX idx_lastname on customers (last_name(20));

select count(DISTINCT LEFT(last_name,1)),
count(DISTINCT LEFT(last_name,5)),
count(DISTINCT LEFT(last_name,10)) from customers;
//25 966 996 所以选5


全文索引
select * from posts where title like "%react redux%" or body like "%react redux%";

create FULLTEXT INDEX idx_titile_body on posts(titile,body);
select * MATCH(title,body) AGAINST('react redux')
from posts
where MATCH(title,body) AGAINST('react redux');
//按照搜索相关性排序

select * MATCH(title,body) AGAINST('react redux')
from posts
where MATCH(title,body) AGAINST('react -redux +form ' IN BOOLEAN MODE);
表示结果中必须含有react form 排除redux
"handling a form" 表示搜索这个短语

复合索引

复合索引
允许对多键创建索引 最多可以16列
create index idx_state_points on customers(states,point);

Drop index idx_state on customers;

复合索引中列的顺序
正常情况下:要把种类多的放在前面

Select customer_id
From customers
Use index(idx_lastname_state)
Where state like ‘a%’ and last_name like ‘a%’;

要搜索所有的州和名字。所以复合索引把名字放前面

Select customer_id
From customers
Use index(idx_lastname_state)
Where state =‘CA’ and last_name like ‘a%’;

因为=的约束更强,所以把州排在前面效率更高。

复合索引以state开头的对于单列points 没有效率

当索引无效
EXPLAIN SELECT customer_id
from customers where state =‘CA’ or points >1000;
此时idx_state_points 不起作用

EXPLAIN SELECT customer_id from customers where points+10>2010;

想要使用索引 必须把列单独表示

索引排序  order by 会使select * 无效
复合索引按照列的顺序进行排序
如果查询中的排序不包含在索引内,将不使用索引
另外多列排序必须是要与索引中保持一致 或者完全相反
不能单独为第二列排序 除了第一列指定

覆盖索引:查询列要被所使用的索引覆盖


索引中 只放了主键和包含的列 查询其他列将不使用索引

维护索引
重复索引
创建新索引之前查看是否会出现多余索引
确保删除重复索引 多余索引 和未使用的索引
(A,B)
X 多余索引
(B)


授权


GRANT SELECT ,INSERT, UPDATE,DELETE,EXECUTE ON sql_store.*
TO moon_app;

SHOW GRANTS FOR John;

REVOKE CREATE VIEW
ON sql_store.*
From moon_app;

posted @ 2021-08-09 09:54  下饭  阅读(47)  评论(0编辑  收藏  举报