2012-06-06 46 views
5

tôi chạy truy vấn mysql sau và xem kiểu như ALL cho truy vấn đầu tiênCách tối ưu hóa truy vấn mysql dựa trên giải thích. (Type: TẤT CẢ

mysql> EXPLAIN 
      SELECT one.language_id as filter_id, 
        one.language_name as filter_name, 
        two.count as count 
      FROM books_f9_languages one 
      INNER JOIN (SELECT language_id, 
         count(*) as count 
         FROM link_f9_books_lists 
         WHERE books_list_id IN (1691,1,2,3,4,6,7,8,9,10,11,12,13,14,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,43,44,47,51,54,57,58,59,68,71,76,77,86,88,93,94,99,120,125,126,127,133,146,147,148,257,260,261,262,263,264,266,267,268,269,270,271,272,275,276,286,767,768,769,771,772,774,777,779,783,785,786,790,792,799,808,811,813,814,815,819,825,828,829,847,850,852,853,855,856,857,858,862,863,866,869,873,875,882,891,900,907,917,925,930,935,1092,1531,1532,1533,1534,1535,1536,1537,1538,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1556,1557,1558,1560,1561,1563,1564,1565,1567,1568,1569,1570,1571,1572,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1586,1588,1589,1590,1591,1592,1595,1597,1599,1600,1601,1603,1604,1605,1606,1607,1608,1609,1610,1612,1613,1614,1615,1616,1617,1620,1621,1622,1623,1624,1625,1627,1628,1629,1630,1632,1636,1637,1638,1639,1640,1642,1643,1644,1645,1646,1648,1649,1651,1652,1653,1654,1659,1660,1662,1665,1675,1677,1679,1680,1689,1692,1693,1696,1698,1699,1702,1703,1705,1711,1713,1714,1716,1717,1719,1720,1726,1728,1729,1732,1734,1735,1736,1738,1743,1744,1753,1754,1755,1756,1759,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1797,1837,827) GROUP BY language_id) two 
      WHERE one.language_id = two.language_id 
      ORDER BY filter_name; 

Đây là đầu ra,

+----+-------------+---------------------+--------+---------------+---------------+---------+-----------------+------+-----------------------------------------------------------+ 
| id | select_type | table    | type | possible_keys | key   | key_len | ref    | rows | Extra              | 
+----+-------------+---------------------+--------+---------------+---------------+---------+-----------------+------+-----------------------------------------------------------+ 
| 1 | PRIMARY  | <derived2>   | ALL | NULL   | NULL   | NULL | NULL   | 5 | Using temporary; Using filesort       | 
| 1 | PRIMARY  | one     | eq_ref | PRIMARY  | PRIMARY  | 4  | two.language_id | 1 |               | 
| 2 | DERIVED  | link_f9_books_lists | range | books_list_id | books_list_id | 4  | NULL   | 273 | Using where; Using index; Using temporary; Using filesort | 
+----+-------------+---------------------+--------+---------------+---------------+---------+-----------------+------+-----------------------------------------------------------+ 
3 rows in set (0.01 sec) 

Những cột tôi phải chỉ số theo thứ tự. để làm cho rằng TẤT CẢ, sử dụng các chỉ số.

Cảm ơn.

Trả lời

1

nguồn gốc bảng tạm thời không thể sử dụng các chỉ số.

Xóa mệnh đề ORDER BY hoặc sắp xếp theo language_id sẽ giải quyết vấn đề đó.

Hoặc, bạn có thể thử thêm chỉ mục hợp chất trên language_id và language_name trên bảng books_f9_languages.

Để cải thiện truy vấn bên trong, hãy thêm chỉ mục hợp chất trên book_list_id và language_id cho bảng link_f9_books_lists.

+0

Tôi đã làm điều này, không thay đổi..mysql> thay đổi bảng books_f9_languages ​​thêm chỉ mục (language_id, language_name); Truy vấn OK, 16 hàng bị ảnh hưởng (0,30 giây) Bản ghi: 16 Bản sao: 0 Cảnh báo: 0 – beck03076

+0

@ beck03076, Bạn vẫn có thể thấy TẤT CẢ trong loại, nhưng là 'Sử dụng tạm thời; Sử dụng filesort' đã biến mất? Đó là những gì đang giết bạn. Nó sẽ luôn luôn là 'ALL' cho một bảng có nguồn gốc. Xin lỗi nếu điều đó không giúp được gì. –

+0

Họ không biến mất Marcus. – beck03076

Các vấn đề liên quan