mysql索引

常见的mysql索引类型:Hash索引、B树、B+树

 

 

 

 在 MySQL 中,MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是,两者的实现方式不太一样。

 

聚集索引

聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。

非聚集索引

非聚集索引即索引结构和数据分开存放的索引。

二级索引属于非聚集索引。

 

 

 

 

 

 

 

 

 

索引下推:和最左匹配都是针对复合索引的。

select * from tb1 where name = ? and age = ?

 

 

 

 

 索引失效

 

 

NOT IN 和 <> !=(两个都是不等于) 操作会另索引失效
列上有null值是可以使用索引的。并且复合索引也是可以允许列上有null。虽然MySQL可以在含有null的列上使用索引,但不代表null和其他数据在索引中是一样的。不建议列上允许为空,最好限制 not null ,并设置一个默认值,比如0和''空字符串等,如果是datetime类型,可以设置成'1970-01-01 00:00:00'这样的值。
对MySQL来说,null 是一个特殊的值,Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values。 对null做算术运算的结果都是null,count时不会包括null行,null 比空字符串需要更多的存储空间等。
 
对索引隐式转换为什么导致索引失效?

比如数据库存储phone字段是varchar类型的,但是使用select * from t_user where phone = 1300000001;语句检索导致全表扫描没有用索引。

原理:select "10" > 9;  输出1,即mysql比较字符串和数字的时候会把字符串转换为数字,因此上面那条语句就变成了select * from t_user where CAST(phone AS signed int) = 1300000001;实际上还是对索引字段使用函数导致索引失效。而select * from t_user where id = "1";就不会导致索引失效,因为这条语句相当于:select * from t_user where id = CAST("1" AS signed int);  并没有对索引字段使用函数,因此索引不会失效。

 

or语句为啥不走索引:select * from t_user where id = 1 or age = 18;  age没有索引,这种情况才会索引失效,因为or是2者满足一个即可,都要检索。解决办法:age也建立索引即可。

 

 

 

整理自www.javaguide.cn

posted on 2021-12-27 21:47  nisico  阅读(62)  评论(0)    收藏  举报

导航