简体   繁体   English

MySql:使此查询更快...有办法吗? 第二部分

[英]MySql: make this query faster… is there a way ? PART TWO

This is part two of the question: MySql: make this query faster... is there a way? 这是问题的第二部分: MySql:使此查询更快...有没有办法?

this query still run slowly: 该查询仍然运行缓慢:

SELECT b.id,
       b.name,
       c.name
FROM bookcorr as a JOIN books as b on b.id = a.books_id =
JOIN Library as c on c.id = a.library_id 
WHERE a.category_id = '2521' 
AND a.library_id = '4983' 
ORDER BY b.name ASC LIMIT 0,15

Any suggest ? 有什么建议吗?

CREATE TABLE `bookcorr` (
  `category_id` smallint(4) unsigned NOT NULL,
  `book_id` mediumint(7) unsigned NOT NULL,
  `library_id` smallint(5) unsigned NOT NULL,
  UNIQUE KEY `cat_id_3` (`category_id`,`book_id`,`library_id`),
  KEY `category_id` (`category_id`),
  KEY `book_id` (`book_id`),
  KEY `library_id` (`library_id`),
  KEY `cat_id_2` (`cat_id`,`com_id`))

CREATE TABLE `books` (
  `id` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
  `com_id` smallint(5) unsigned NOT NULL,
  `name` varchar(256) NOT NULL,
    ....
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  FULLTEXT KEY `search` (`name`,`author`)
)

 CREATE TABLE `Library` (
  `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL,
  ...
  UNIQUE KEY `id` (`id`),
  KEY `library_name` (`name`)
) 

CREATE TABLE `Category` (
  `id` smallint(4) unsigned NOT NULL,
  `name` varchar(100) NOT NULL,
  UNIQUE KEY `id` (`id`),
  KEY `name` (`name`),
)

Here: 这里:

+----+-------------+-------+--------+----------------------------------------+----------+---------+----------------------------+------+-------------+
| id | select_type | table | type   | possible_keys                          | key      | key_len | ref                        | rows | Extra       |
+----+-------------+-------+--------+----------------------------------------+----------+---------+----------------------------+------+-------------+
|  1 | SIMPLE      | b     | index  | NULL                                   | name     | 258     | NULL                       |   15 |             |
|  1 | SIMPLE      | a     | eq_ref | cat_id_3,cat_id,book_id,library_id     | cat_id_3 | 7       | const,b.id,const           |    1 | Using index |
|  1 | SIMPLE      | c     | const  | PRIMARY                                | PRIMARY  | 2       | const                      |    1 | Using where |
+----+-------------+-------+--------+----------------------------------------+----------+---------+----------------------------+------+-------------+

Looks like you need to study how to use "explain select". 看来您需要研究如何使用“解释选择”。

It will make all your queries faster! 这将使您所有的查询速度更快! :) :)

SELECT  b.id,
        b.name,
        c.name
FROM    books as b
JOIN    bookcorr as a
ON      a.books_id = b.id
        AND a.category_id = '2521' 
        AND a.library_id = '4983' 
JOIN    Library as c
ON      c.id = a.library_id 
ORDER BY
        b.name ASC
LIMIT 15

Create the following indexes: 创建以下索引:

books (name)
bookcorr (category_id, library_id, books_id)

Update: 更新:

If you need the total record count, it would be better doing it in two queries. 如果需要总记录数,最好在两个查询中进行。

Assuming that books_id and library_id always reference a record in books and library , use this query: 假设books_idlibrary_id始终引用bookslibrary的记录,请使用以下查询:

SELECT  COUNT(*)
FROM    bookcorr a
WHERE   a.category_id = '2521'
        AND a.library_id = '4983' 

to calculate the count. 计算计数。

Update 2: 更新2:

SELECT  b.id,
        b.name,
        c.name
FROM    books b USE INDEX (name)
STRAIGHT_JOIN
        bookcorr a
ON      a.books_id = b.id
        AND a.category_id = '2521' 
        AND a.library_id = '4983' 
STRAIGHT_JOIN
        Library as c
ON      c.id = a.library_id 
ORDER BY
        b.name ASC
LIMIT 15

在bookcorr表中添加一个books_id索引。如果查询仍然很慢,请尝试使用数字id作为books(整数)。

mysql> explain SELECT b.id,b.name,c.name FROM bookcorr as a JOIN books as b on a.book_id = b.id JOIN library as c on b.library_id=c.id WHERE a.category_id = '2302' AND a.library_id = '4983' order by b.name asc LIMIT 0,15; mysql>解释SELECT b.id,b.name,c.name FROM bookcorr as JOIN在a.book_id = b.id上将b作为书本在b.library_id = c.id上的JOIN库在哪里a.category_id ='2302 'AND a.library_id ='4983'按b.name asc LIMIT 0,15排序;

+----+-------------+-------+--------+----------------------------------------+----------+---------+--------------------+------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                          | key      | key_len | ref                | rows | Extra                                        |
+----+-------------+-------+--------+----------------------------------------+----------+---------+--------------------+------+----------------------------------------------+
|  1 | SIMPLE      | a     | ref    | cat_id_3,cat_id,book_id,library_id     | cat_id_3 | 4       | const,const        | 1788 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | b     | eq_ref | PRIMARY,library_id                     | PRIMARY  | 3       | dbname.a.book_id   |    1 |                                              |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                                | PRIMARY  | 2       | dbname.b.library_id|    1 |                                              |
+----+-------------+-------+--------+----------------------------------------+----------+---------+--------------------+------+----------------------------------------------+

是错字还是为什么在原始查询中这样的SQL(?):

JOIN books as b on b.id = a.books_id = JOIN Library as c on c.id = a.library_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM