desc userinfo 3; # 显示所有列
普通索引:
index 索引名(列名) # 创建表的时候
creat index 索引名 on 表名(列名)
drop index 索引名 on 表名
唯一索引:
unique 索引名(列名) # 创建表的时候
creat unique index 索引名 on 表名(列名)
drop unique index 索引名 on 表名
联合(组合)索引:
creat index 索引名 on 表名(列名,列名) # unique同理
drop index 索引名 on 表名
主键:
primary key (列名)
alter table 表名 add primary key(列名) # 后天创建
作用:
约束
加速查找
索引:
普通索引:加速查找
主键索引:加速查找 + 不能为空 + 不能重复
唯一索引:加速查找 + 不能重复
联合索引(多列):
联合主键索引
联合唯一索引
联合普通索引
最左前缀匹配
加速查找:
select * from tb1 where name = 'asd'
select * from tb1 where id = 999
无索引:从前到后依次查找
索引:
创建以某种格式存储的额外文件
查询快,插入更新删除慢
命中索引
索引种类(某种格式存储):
hash索引:
单值速度快
取范围速度慢(顺序被打乱)
btree索引:
二叉树(默认,速度快)
覆盖索引:
select email fron tb1 where email = ''
在索引文件中直接获取数据,不去表里取
索引合并:
select email fron tb1 where email = '' and id = 999
把多个单列索引合并使用
# 没有组合索引效率高,经常用应该用组合
索引命中:
like 效率低,数据量大的时候一般用第三方工具
尽量不要用函数 类似reverse(name)
or后面没索引的话会未命中,索引 or 非索引 and 索引会命中
数据类型不一致会未命中降低效率(查找条件和数据本身类型)
普通索引 != 会效率低,主键不会
>会降低效率,主键或整数类型索引不会
order by:根据索引排序的时候,如果选择的映射不是索引,会未命中,主键除外
联合索引最左匹配
注意事项:
避免使用select *
count(1)或count(列)代替count(*)
尽量用char代替varchar
表的字段顺序固定长度的字段优先
组合索引代替多个单列索引(经常使用多个条件查询时)
尽量使用短索引 # creat index 索引 on tb(title(8)) text这种必须指定长度
使用join代替子查询
连表时注意条件类型需一致
索引散列值(重复少)不适合建索引,比如性别
执行计划:
预估执行操作
exlpain select * from userinfo3;
type:ALL (全表扫描)
type:ref (走了索引)
性能:
all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
limit是特殊情况(limit 1)速度快
慢日志:
内存:
show variables like 'query'
set global 变量名 = 值
slow_query_log = OFF
long_query_time = 2
slow_query_log_file = /usr/slow.log
log_queries_not_using_indexes = OFF
配置文件:
mysqld --defaults-file = 'D:\my.conf'
mydefault.ini # 修改配置文件之后需要重启服务,注意备份
分页:
limit 0,10这种数据量大的时候效率低
索引表中扫,速度提升有限
考虑到id不连续问题,所以不能用between and
最优方案,记录当前页最大最小ID结合python语句:
1.页面只有上一页,下一页
select * from userinfo where id > max_id limit 10;
select * from userinfo where id < min_id order by id desc limit 10;
2.上一页 192 193 [194] 195 196 197 下一页
想看197
select * from userinfo where id in (
select id from (select id from userinfo where id > max_id limit 30) as N order by N.id desc limit 10)
)