我正在使用MYSQL管理图书库数据,这是我的主表
CREATE TABLE `book` (
`id` int(11) NOT NULL,
`bookId` int(11) DEFAULT NULL,
`pageNum` smallint(6) DEFAULT NULL,
`pageData` longtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
现在,当我运行此查询时
SELECT c.id, c.bookId,c.pageNum, c.pageData, o.BookName FROM book c left
join kotarbooks o on c.bookId=o.BookId WHERE pageData like '%[Search Word]%'"
大约需要3分钟
当我运行查询时
SELECT * FROM book WHERE bookid=[bookid] AND pageNum=[pageNumber]
大约需要2分钟 有什么想法可以加快这些查询的速度吗? 非常感谢
答案 0 :(得分:0)
我运行查询
SELECT * FROM book WHERE bookid=[bookid] AND pageNum=[pageNumber]
大约需要2分钟
您可以创建索引以加快过滤速度:
CREATE INDEX idx ON book(bookid, pageNum);
对于WHERE pageData like '%[Search Word]%'
来说并不是那么琐碎,因为您在一开始使用'%'
进行搜索,并且查询不是SARGable。
答案 1 :(得分:0)
LIKE
表达式:
WHERE book.pageData LIKE '%[Search Word]%'
是不可保留的,因此book
表上的任何索引可能不会被MySQL使用。因此,我们可以改为采用book
表上的全表扫描策略以及kotarbooks
表上的索引:
CREATE INDEX kotaridx ON kotarabooks (BookId, BookName);
包含BookId
列应有助于连接,BookName
涵盖了此列,因为它出现了select子句。