如果不了解数据库索引相关的知识,我们可能在写查询语句时就会浪费已有的索引,注意哪些情况会不走索引,我们在写查询语句时可以尽可能避免对应的场景。
使用索引的优点
1、提高数据搜索的速度;
2、加快表与表之间的连接速度;
3、使用分组或排序时,如果有索引,可以加快分组或排序的速度,从而提高搜索效率;
4、主键索引和唯一索引可以保证每一行数据的唯一性,防止改动数据时对应错数据行。
索引的缺点
1、创建数据库时,需要花费时间去创建和维护索引;
2、索引会占用存储空间;
3、修改表的数据时,也需要动态维护索引。
数据库索引的分类
主键索引、唯一索引、普通索引、全文索引、组合索引
主键索引:不能为空+不能重复+加速查询;
唯一索引:不能重复+加速查询;
普通索引:加速查询;
全文索引:对文本的内容进行分词,进行搜索;
组合索引:多列组成一个索引
主键索引:PRIMARY KEY
创建唯一索引:ALTER TABLE tableName ADD UNIQUE(字段名)
创建普通索引:ALTER TABLE tableName ADD INDEX indexName(字段名)
创建全文索引:ALTER TABLE tableName ADD FULLTEXT (字段名1,字段名2)
创建组合索引:CREATE INDEX indexName ON tableName(col_name_1,col_name_2);
删除索引:DORP INDEX indexName ON ‘tableName’
不走索引的情况
1、对索引列有不等于(!=、<>)的条件语句;
2、对索引列使用函数的语句;
例如:sname字段创建了索引
WHERE concat(`sname`,'abc') ='Jaskeyabc' 不走索引
WHERE `sname` =concat('Jaskey','abc') 走索引
3、对索引列进行计算的语句;
例如:age字段创建了索引
那么where age +30=40,不走索引
Where age = 40-30,走索引
4、模糊查询%放在前面的;
模糊查询,%在前面,不走索引,%放末尾,走索引
5、查询条件有or,但不是每个语句都创建了索引(不是每个条件都创建了索引,会导致所有索引都失效;如果每个条件都创建了索引,是走索引的);
6、字符串列查询,对应的值没有使用引号;
例如:a列是字符char类型,创建了索引
WHERE `a`='1' -- 走索引
WHERE `a`=1 -- 字符串和数字比较,不走索引
但是如果那个列是一个数字类型,拿来和字符类型做比较,则不会影响到使用索引,但仍需尽量避免一切隐式类型转换
7、组合索引,没有遵守最左匹配原则;
8、MySQL认为全表扫描会比走索引快,它就会不走索引(这种情况一般不用理会,如果实在要让它走索引,可以使用 force index强制MySQL走索引)。