索引
索引种类
普通索引:仅加速查询
唯一索引:加速查询+列值唯一(可以有null)
主键索引:加速查询+列值唯一+表中只有一个(不可以有null)
组合索引:多列值组成一个索引,注明用于组合所有,其效率大于索引合并(向左合并,如果根据右边还是全表查询)
全文索引:对文本的内容进行分词,进行搜索
相关命令:
查看表结构 desc 表名
查看生成表的sql语句: show create table 表名
查看索引: show index from 表名
查看执行时间 set profiling=1;SQL。。 show profiles;
explan 查询表,可以查看通过索引还是全表查询的,all 代表全表,ref 代表普通索引
知识点:
如果没有索引时,limit 1 只查找第一个出现的
select * from tb1 limit 1;
like ‘*xx’或%,即使创建索引也不会走索引
函数:
select count(1) from tb1 where reverse(name)='wuper-0' //reverse(name)字段函数也不会走索引
select count(1) from tb1 where name=reverse('wuper-0') //reverse(name)对值进行反转函数会走索引
or :
select * from where name=‘a’ or email=‘w’ 两个都建索引时会走索引,如果只有一个建不会走索引
类型不一致:
select * from tb1 where name='alex' name 为varchar类型 走索引 name=999类型不一致不会走索引
!=:不会走索引,如果是主键!=也会走索引
>:不会走索引 数字或主键仍会走索引
between and in <:都会走索引
order by :
select email from tb1 order by name desc ,前后不一样不会走索引
组合索引最左前缀(name,email):
name和email 走索引
name走索引
email 不走索引
覆盖索引:如果在索引表可以查到所有数据则不会走数据表
索引合并:(两个单列索引合并)
a and b建组合索引的效率比两个单列索引效率高
6.注意项:
避免使用select *
count(1)或count(列) 代替count(*)
创建表尽量用char 代替varchar
表的字段顺序固定长度优先
组合所以代替单列索引(经常使用多条件)
尽量使用短索引
使用连接JOIN来代替子查询Sub-Queries
连表时注意调节类型需一致
索引散列值(重复少)不适合建索引,例,性别不适合
7.执行计划
explain +查询sql语句
主要看type和rows ,type可以看出是否走索引,all是没有走索引
id是是看出来执行机构sql
type:all<index<range<index_merge<ref_or_null
range:<,>范围操作
index_merge:索引合并
key:真实用的索引
rows:预估扫描多少行
9.慢日志查询 my-defult.ini配置文件【mysqld】写
slow_query_log=OFF //是否开启慢日志记录
long_query_time=2 //时间限制,超过此时间,则记录
slow_query_log_file=/usr/slow.log 日志文件
log_queries_not_using_indexes=OFF 为使用索引的搜索是否记录
show global variables 查询全局变量
设置全局变量的值 set global slow_query_log=ON;
浙公网安备 33010602011771号