你必须先了解下 mysql 中 explain 关键字的用法以及索引的相关知识。mysql
这是一张文章表,请忽略表的其余相关设计, 只需关注 title 字段,咱们在 title 字段上创建索引。sql
`CREATE TABLE `bbs_posts` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` mediumtext COLLATE utf8mb4_bin NOT NULL COMMENT '标题', `content` mediumtext COLLATE utf8mb4_bin NOT NULL COMMENT '帖子内容', `create_time` datetime NOT NULL COMMENT '建立时间', `create_user` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '发帖人', `update_time` datetime DEFAULT NULL COMMENT '编辑时间', `update_user` datetime DEFAULT NULL COMMENT '编辑人', PRIMARY KEY (`id`), KEY `title_index` (`title`) ) ENGINE=InnoDB`
1. select * from bbs_posts where title like %keyword% 2. select * from bbs_posts where title like %keyword 3. select * from bbs_posts where title like keyword%
咱们了解到的一条结论是:上述的前两个 sql 执行时是不会走索引的,而第三条 sql 是会走索引查询的。post
咱们这里忽略了一条不常见的可能性,那就是当咱们的 title 字段里存储的数据区分度不高时,第三条 sql 的like关键字的用法一样不会走索引。 好比 :咱们存储的都是 ‘湖人总冠军123’,‘湖人总冠军456’ 相似这样的值。而咱们的 sql 是这样的: select * from bbs_posts where title like 湖人总冠军%;这个时候sql 查询时,仍然会全表扫描。设计