Chi*_*hip 8 mysql sql indexing
想象一下,我有一个表格,其中包含一本书的所有章节以及每章的开始/结束页面.
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
Run Code Online (Sandbox Code Playgroud)
我试图找出随机页面的章节,比如第215页.
我的第一个想法是使用这样的查询
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
Run Code Online (Sandbox Code Playgroud)
不幸的是,MySQL无法利用上述查询中的索引,这是一个很大的问题,因为我的表格很大.
在做了一些研究之后,我想出了这个利用索引的查询.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
现在的问题是我希望能够在仍然利用索引的同时查询多个随机页面.我似乎不太可能修改我的上一个查询,因为它非常依赖于将结果限制为一个.
任何建议将不胜感激!
更新: 感谢Ray Toal的评论我有一个查询,它给了我惊人的性能所需的结果.
SELECT chapter
FROM book
WHERE (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 73) AND end_page >= 73)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 92) AND end_page >= 92)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 300) AND end_page >= 300)
Run Code Online (Sandbox Code Playgroud)
添加两个复合索引:
ALTER TABLE book
ADD INDEX `page_range_from_start` (start_page, end_page)
ADD INDEX `page_range_from_end` (end_page, start_page)
Run Code Online (Sandbox Code Playgroud)
并继续您的原始查询:
SELECT `chapter`
FROM `book`
WHERE
`start_page` <= 215
AND `end_page` >= 215
Run Code Online (Sandbox Code Playgroud)
MySQL 将选择以要扫描的剩余行数最少的列开头的索引,然后它将使用索引的第二部分来减少到单个所需的行(无需扫描)。
| 归档时间: |
|
| 查看次数: |
1392 次 |
| 最近记录: |