如何使用ORDERBY子句(MySQL)为SQL查询选择正确的索引
我在MySQL中有一个查询,如下所示:如何使用ORDERBY子句(MySQL)为SQL查询选择正确的索引,mysql,sql,indexing,sql-order-by,Mysql,Sql,Indexing,Sql Order By,我在MySQL中有一个查询,如下所示: SELECT t.field1, t.field2, t.field5, t.field6, t.field7 FROM mytable as t WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0 order by t.field5 desc LIMIT 0, 100; 查询速度不是很快10秒,问题似乎是按部分排序,如果没有这一行,
SELECT t.field1, t.field2, t.field5, t.field6, t.field7
FROM mytable as t
WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0
order by t.field5 desc
LIMIT 0, 100;
查询速度不是很快10秒,问题似乎是按部分排序,如果没有这一行,查询需要0.01秒,使用ASC而不是desc大约需要1秒
我已经创建了一个索引,其中WHERE/ORDER中的所有字段按照查询字段1、字段2、字段3、字段4、字段5中显示的顺序排列,但根据MySQL中的解释,没有使用该索引
field1具有相当高的基数整数,大约有100个不同的值field2和field3是布尔值,field5是具有高基数的字符串,但是LENGTHfield5>0使基数变低,或者
字段5上还有一个索引,这是查询如上所示时使用的唯一索引,删除部分查询的顺序将使MySQL使用多列索引
我错过了什么
编辑:以下是实际的SQL:
SELECT t.shopid, t.isproduct, t.level, t.isduplicate, t.ref_id
FROM urls as t
WHERE t.shopid = 72 AND t.isproduct = 1 AND t.visited = 0 AND LENGTH(t.url) > 0
ORDER BY t.level desc
LIMIT 0, 100;
在不知道表大小和数据类型的情况下,很难预测查询性能。Mysql优化器有自己的方法来决定使用哪个索引,这通常是非常好的。 您可以通过强制mysql使用forceindex来使用各种索引来进行点击和试用。由于明显的原因,永远不能使用t.url上的索引 您可以尝试的一件事是: 从mytable中选择t.field1、t.field2、t.field5、t.field6、t.field7中选择t.field1、t.field2、t.field5、t.field6、t.field7作为t,其中t.field1=a,t.field2=b,t.field3=c,长度t.field4>0T,按t.field5描述限制0、100排序
通常不建议这样做,但如果输出行数不是很大,则可以帮助您。LENGTHt.field4>0与t.field4相同。field4不为空,而t.field4!=当你开始进行复杂的查询和优化时,上下文就是一切。我建议您用真实的查询替换您的psuedo sql示例,因为几乎不可能给出直接答案,即知道其中一个字段是否是ID主键,在帮助时可能是非常宝贵的信息否,没有聚集索引。将ORDER-BY字段作为索引的最后一个字段是否正确?这个问题可以用子查询来解决吗?也许可以试试shopid、iProduct、visited、level、,url@ypercube:我试过了,但结果还是一样的……太棒了!现在它下降到0.2秒,这在这个特定的环境下是可以接受的,我不希望数据在未来增长,所以我想我会坚持这个解决方案。非常感谢@azi,也感谢Ashalynd、Lee和ypercube的回应和努力/安德烈亚斯