use test ;
show index from user; # 查看表索引
drop index idcard on user; # 删除表索引

create index testa on user (id,idcard) ; # 创建联合索引
/*
最左前缀法则
如果索引关联了多列(联合索引),要遵守最左前缀法则,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。
如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。可以用>=或者<=来规避索引失效问题
*/

/*
索引失效情况
在索引列上进行运算操作,索引将失效。如:explain select * from tb_user where substring(phone, 10, 2) = '15';
字符串类型字段使用时,不加引号,索引将失效。如:explain select * from tb_user where phone = 17799990015;,此处phone的值没有加引号
模糊查询中,如果仅仅是尾部模糊匹配,索引不会是失效;如果是头部模糊匹配,索引失效。如:explain select * from tb_user where profession like '%工程';,前后都有 % 也会失效。
用 or 分割开的条件,如果 or 其中一个条件的列没有索引,那么涉及的索引都不会被用到。
如果 MySQL 评估使用索引比全表更慢,则不使用索引。
*/

# SQL 提示
# 了解作用后我更喜欢叫它 索引指示,它会告诉mysql我让你使用/不使用/必须使用某个索引
set profiling = 1; # 开启profile
select * from user use index (`PRIMARY`) where id = 5; # 告诉mysql使用主键索引
show profiles ; # 请自行翻阅sql语句查看执行时间

select * from user ignore index (`PRIMARY`) where id = 5 ; # 告诉mysql不要使用主键索引
show profiles ;

select * from user force index (`PRIMARY`) where id = 5 ; # 告诉mysql,必须使用主键索引
show profiles ;
# 看日志太麻烦?explain 查看是否使用主键也可以