mysql索引的疑问
问题描述
explain select * from t_warning where FIND_IN_SET(’214’,t_wuserid) and FIND_IN_SET(’214_0’,t_wkstatus) and ((t_wstatus=2 and unix_timestamp(t_wstarttime)<=1485313428 and unix_timestamp(t_wendtime)>=1485313428) or t_wstatus=1 or (t_wstatus=3 and t_week=3)) and FIND_IN_SET(’2’,t_wtype) order by t_createtime desc limit 50;
这条语句牵扯到的 where 条件的字段都加上了索引,为什么索引还是没有起作用?如何改sql?这条sql感觉写的不好。
问题解答
回答1:FIND_IN_SET 是不会用到索引的呀,不知道索引类型是 FULL_TEXT 的是否能利用。
回答2:你这条语句查询条件太复查,肯定是全表扫描,本人也不能写出使用你这种情况的sql语句。建议,先将数据取出,再在 程序里做过滤
回答3:是否使用索引,mysql会感觉各个执行计划的整体进行判定,不是说查询条件中的字段有索引就一定会用。
具体到你提到的sql语句,需要针对数据和and的各个条进行分析,是否存在能够大量过滤数据的条件(一般情况符合条件的记录要小于表总记录数的10%),然后针对这个条件的字段创建索引。
相关文章:
1. mysql - SQL添加记录的数据来源于同一个表2. 与远程浏览器通信时出错它可能已经死了Selenium Web驱动程序3. docker-machine添加一个已有的docker主机问题4. docker - 各位电脑上有多少个容器啊?容器一多,自己都搞混了,咋办呢?5. MYSQL 导出数据到多个csv文件,每个文件只需要200条数据,一次select完成有没有方法 ?6. 使用mysql自增主键遇到的问题7. javascript - arguments.callee8. mysql - 求一个sql语句,比较简单。9. javascript - 如何清除向可编辑的(contenteditable)元素里粘贴的文本的标签和样式?10. java编程思想第4版中文版的几处谬误?

网公网安备