Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ORDERBY子句(MySQL)为SQL查询选择正确的索引_Mysql_Sql_Indexing_Sql Order By - Fatal编程技术网

如何使用ORDERBY子句(MySQL)为SQL查询选择正确的索引

如何使用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秒,问题似乎是按部分排序,如果没有这一行,

我在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秒,问题似乎是按部分排序,如果没有这一行,查询需要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的回应和努力/安德烈亚斯