问题描述
- Mysql添加索引后的查询失败问题
- sql语句如下:
.
select blog0_.blogId as blogId5_ blog0_.className as className5_ blog0_.title as title5_ blog0_.content as content5_ blog0_.createDate as createDate5_ blog0_.pictureSum as pictureSum5_ blog0_.adminId as adminId5_ from blog blog0_ where 1=1 and blog0_.className=1 order by blog0_.blogId DESC limit 110;
.
索引在className上。
.
未建立索引前该语句可以查询出需要的数据;
.
建立索引之后该语句只能执行出 0 rows;
.
然后开始explain,发现是走了索引的,但却没有拿到数据。
.
把select * 换成select abcd from 。。。之后,找到了问题出现的地方:
.
数据表中有一列数据remark是text类型,如果用select * 或select abcremark。。。进行查询的话,就直接查到了0条数据。
.
如果select的时候不加remark这一列,就能正常完成查询。
.
那么问题来了,我不可能不用remark这一列的,也不可能改动表说把remark这一列挪到新的一张表中。
.
好了小伙伴们,我只想SELECT * FROM
xxx_blog
where className = 1 ORDER BY blogId DESC LIMIT 110;这条语句可以正常执行,到底有什么办法解决问题呢?
解决方案
sql语句如下:
.
select blog0_.blogId as blogId5_ blog0_.className as className5_ blog0_.title as title5_ blog0_.content as content5_ blog0_.createDate as createDate5_ blog0_.pictureSum as pictureSum5_ blog0_.adminId as adminId5_ from blog blog0_ where 1=1 and blog0_.className=1 order by blog0_.blogId DESC limit 110;
.
在className字段下加了索引之后,sql语句就搜不到结果了。未添加索引之前是正常运行的。
.
后来发现如果把order by 语句删除,添加索引之后的sql一样能搜索到结果。
.
求大神指导到底是什么情况?
答:索引只会影响sql的执行效率,不会影响执行结果,也有可能是你的索引建的有问题,删除以后重新建试试
解决方案二:
用explain观察下看看
解决方案三:
order by 只是影响排序,不会影响结果,可以把sql执行的完整过程贴一下