在许多的许多的项目中对于查询的方式,模糊查询可以说是必不可少的一部分功能,在我们日常开发中用得最多的方式就是使用LIKE
,这种方式也不是说不行,但是,LIKE有一个很大的缺点:使用了LIKE进行查询的时候,索引会失效。
我勒个去,索引失效(⊙_⊙)?
是的,我们后端开发人员都应该知道当数据库数据量大的时候,索引是数据库优化的一个方案,那么LIKE会让索引失效毫无疑问就会导致查询效率低下。
在MySQL数据库中可以使用EXPLAIN
来查看SQL语句的执行情况。
EXPLAIN SELECT * FROM product WHERE product_id LIKE "%1%";
执行效果是这样的:
这里可以很清楚的看到key
这一列是Null的,这就代表着要么是数据库没有设置索引,要么就是LIKE会让索引失效。
因为我在product这个表中将索引放在了主键ID上,所以我就对主键ID进行查询了。
EXPLAIN SELECT * FROM product WHERE product_id = 12;
结果如下:
可以很明显的看到Key这一列不是为NULL的,这就表示索引生效了。
目前Navicat在中国时常还是比较流行的,并且功能做得很完善,但是,版本 > 12后就需要收费了,言归正传:
右击需要添加索引的表 -> 设计表 -> 索引
,就会打开下图:
设置完成后保存就行了,可视化还是挺简单的😀。
ALTER TABLE `table_name` ADD INDEX index_name ( `column` );
ALTER TABLE `table_name` ADD UNIQUE (`column`);
ALTER TABLE `table_name` ADD FULLTEXT ( `column` );
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` );
以下三种方式也都会让索引失效,所以这里只是做一个了解,防止碰到的时候认为效率会比LIKE好,其实都是一样的。
SELECT * FROM product WHERE LOCATE("1",product_id);
SELECT * FROM product WHERE POSITION("1" IN product_id);
SELECT * FROM product WHERE INSTR(product_id,"1");
以上的SQL执行结果都是一样的,所以后面两条执行结果就不展示了,和第一条是一样的。
本人资历有限,没有接触过太多数据库优化的方案,所以上述如有错误,还望指出。