1.索引什么时候会失效?
①查询条件包含or,可能导致索引失效
当查询条件中包含OR操作符时,可能会导致索引失效的原因是因为OR操作符会使数据库无法充分利用索引进行高效的查询。具体来说,当使用OR操作符连接多个条件时,数据库系统需要分别检索每个条件的索引并将结果进行合并,这可能会导致数据库放弃使用索引而选择全表扫描来获取结果。
举例来说,假设有一个包含两个条件的查询:column1=value1 OR column2=value2。如果数据库系统无法同时利用column1和column2上的索引,它可能会选择扫描整个表来查找符合条件的行,而不是使用索引来快速定位符合条件的行。
②如果字段类型是字符串,在使用where语句时一定要用引号括起来,否则索引失效。
例: SELECT * FROM table1 WHERE name = 'John'; √
SELECT * FROM table1 WHERE name = John; ×
③like通配符可能导致索引失效
使用LIKE通配符(例如%,_)可能导致索引失效的原因是因为通配符的模糊匹配性质会使得数据库无法充分利用索引进行高效的查询。具体来说,当使用LIKE操作符进行模糊匹配时,数据库系统需要逐个检查每一条记录以确定是否符合LIKE条件,这可能会导致数据库放弃使用索引而选择全表扫描来获取结果。
④在索引列上使用mysql的内置函数,索引失效
在索引列上使用MySQL的内置函数可能导致索引失效的原因是因为数据库引擎无法直接对函数应用于索引列的结果进行索引查找。具体来说,当对索引列应用内置函数时,数据库系统需要对每一条记录进行函数计算,然后再进行比较,这会导致无法充分利用索引的优势。
举例来说,假设有一个包含函数的查询条件:LOWER(column1)=′value′。如果数据库系统无法直接在索引列column1上应用LOWER函数,它可能会选择放弃使用索引而进行全表扫描来获取结果。
⑤对于索引列运算(如:+、-、*、/),索引失效
⑥索引字段上使用(!=或者<>,not in)时,可能会导致索引失效
⑦索引字段上使用is null,is not null时,可能会导致索引失效
2.为什么用B+树
数据库索引一般使用B+树的原因如下:
1. **有序性**:B+树是一种平衡树,可以保持数据有序,这样可以更快地进行范围查询和排序操作。
2. **减少磁盘I/O**:B+树的叶子节点都存储了指向实际数据的指针,这样可以减少磁盘I/O次数,提高查询效率。
3. **高度平衡**:B+树的特性保证了树的高度较低,查询时需要的查找次数较少,性能较好。
4. **支持范围查询**:B+树的有序性和叶子节点存储数据的特点,使得范围查询效率较高。
5. **适合磁盘存储**:B+树的节点大小适中,适合存储在磁盘上,可以有效利用磁盘空间。
3.覆盖索引
覆盖索引是select的数据列只用从索引中就能够取得,不必回表,换句话说,查询列要被所建的索引覆盖。
4.Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?
B+树可以进行范围查询,Hash索引不能。
B+树支持联合索引的最左侧原则,Hash索引不支持。
B+树支持order by排序,Hash索引不支持。
Hash索引在等值查询上比B+树效率更高。(但是索引列的重复值很多的话,Hash冲突,效率降低)。
B+树使用like进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊查询。
5.索引有哪些优缺点?
优点:
·索引可以加快数据查询速度,减少查询时间
·唯一索引可以保证数据库表中每一行的数据的唯一性
缺点:
·创建索引和维护索引要耗费时间
·索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间·以表中的数据进行增、删、改的时候,索引也要动态的维护。
6.索引分类
7.什么场景不适合建立索引
①数据量少的表
②更新频繁的
③区分度低的字段
④where、group by、order by等后面没有使用到的字段