<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM users ORDER BY id LIMIT 100000, 10;
</code></pre></p>
在此查询中,MySQL需要执行以下操作:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM users WHERE username LIKE 'A%' ORDER BY id LIMIT 100000, 10;
</code></pre></p>
在此查询中,MySQL首先找到以索引上的“ A”开头的所有记录,然后对记录进行分组并执行表返回操作以获取完整的用户信息。当值大时,此过程将变得非常低效,因为:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM users WHERE id = (SELECT id FROM users WHERE username LIKE 'A%' ORDER BY id LIMIT 100000, 1) LIMIT 10;
</code></pre></p>
在此示例中,该子查询首先找到具有大于或等于特定值的记录,而主查询开始从此ID搜索,从而减少了不必要的表返回操作。
2。内部加入延迟关联政策
延迟关联策略通过首先获得符合条件的ID集,然后用原始表执行联接操作来获得完整的数据。
地下原则:
例子:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT u.* FROM users u INNER JOIN (SELECT id FROM users WHERE username LIKE 'A%' ORDER BY id LIMIT 100000, 10) AS sub ON u.id = sub.id;
</code></pre></p>
在此示例中,子查询生成的临时表子包含要检索的ID集,然后通过内连接连接到用户表,以直接访问主键索引。
3。标签记录方法策略
标签记录方法记录了最后一个查询的最后一个ID,下一个查询以该ID开头。
地下原则:
例子:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM users WHERE id > last_id ORDER BY id LIMIT 10;
</code></pre></p>
这是最后一个查询的最后一个ID。通过这种方式,您可以直接跳过以前查询的数据。
4。使用…和…策略
策略说明:使用…和…而不是直接指定查询范围。
地下原则:
例子:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM users WHERE id BETWEEN start_id AND end_id;
</code></pre></p>
在此示例中,总和是一个预计数的ID范围,MySQL可以直接检索数据。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31' ORDER BY order_id LIMIT 100000, 10;
</code></pre></p>
此查询的问题在于,随着限制值的增加,查询性能将大大下降。这是因为MySQL需要扫描大量行才能找到符合标准的记录。
优化策略应用
以下是上述查询的优化策略应用程序:
1。子查询优化
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM orders WHERE order_id = (SELECT order_id FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31' ORDER BY order_id LIMIT 100000, 1) LIMIT 10;
</code></pre></p>
在此优化中,该子查询首先找到起始位置,然后主要查询从此开始,从而降低了表格操作。
2。内联合延迟关联
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT o.* FROM orders o INNER JOIN (SELECT order_id FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31' ORDER BY order_id LIMIT 100000, 10) AS sub ON o.order_id = sub.order_id;
</code></pre></p>
在这里,子查询创建一个包含所需的表,然后通过内连接与表与表连接在一起,以直接访问主键索引。
3。标签记录方法
假设我们已经知道最后一个查询中的最后一个是,我们可以使用以下查询:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM orders WHERE order_id > 200000 AND order_date BETWEEN '2023-01-01' AND '2023-01-31' ORDER BY order_id LIMIT 10;
</code></pre></p>
这种方法使我们可以直接从上一个查询开始,避免撤销。
4。使用…和…
如果我们知道查询的ID范围,我们可以直接使用它:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>SELECT * FROM orders WHERE order_id BETWEEN 100001 AND 100010 AND order_date BETWEEN '2023-01-01' AND '2023-01-31' ORDER BY order_id;
</code></pre></p>
此查询直接指定范围,减少了扫描的行数。