mysql数据库-索引
索引是数据库中用来提高查询效率的一种数据结构,在mysql中的索引默认采用B+树的数据结构,如果没有索引,执行查询时,
mysql必须扫描整张表的记录 ,直至找到所有符合要求的记录,在数据量比较大时,这样做会带来需要开销。如果作为搜索条件
的列上带有索引,则mysql可以通过索引结构迅速得到符合要求的记录。
索引类型有
1. 唯一索引
2. 联合索引 联合索引遵循最左前缀原则 create index index_name on table_name(id,name,gender)
根据最左前缀原则,当搜索条件 select id from table_name where id=1; select id,name ... select id,gender
索引失效的条件有:
1. where 的查询条件中 与 or
2. 使用like 模糊查询时,使用% 开头,索引不起作用
最左前缀原则详解:
假设有这样一个索引——(a,b,c),针对下面的5个关于最左原则的解释,做出举例。
1.必须用到索引的第一个字段,如select * from table where b=’b’ and c=’c’,不会使用到索引。
2.对于索引的第一个字段,用like时左边必须是固定值,通配符只能出现在右边,如select * from table where a like ‘%a%’不会使用到索引,而select * from table where a like ‘a%’则会使用到索引。
3.如果在字段前加了函数或在字段前嵌入了表达式,则不会使用索引。如select * from table where trim(a)>1不会使用索引,select * from table where a+1>1也不会使用索引,而select * from table where a>2会使用到索引。
4.索引的使用与where语句中字段出现的顺序无关,只与是否使用到索引相关字段有关。如select * from table where b=’b’ and a=’a’也会使用索引。
5.使用到索引第一个字段的不等于表达式,即使其他字段不是索引字段也会使用到索引。如select * from table where a=’a’ and ddd=’ddd’会使用到索引。
对索引的基本优化
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from twhere num=0
3、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: