【问题标题】:Why MYSQL doesn't use my indexes?为什么 MYSQL 不使用我的索引?
【发布时间】:2014-03-18 05:42:18
【问题描述】:

我有一个表karton00,其中包含数千条记录。这会使查询变慢。我想使用索引,但即使我设置了它们,它们也没有被使用。

Here is my table.here is the result of using EXPLAIN.

这是我的查询:

SELECT '' checkbox,
       k00_eszkozid,
       k00_eszkoznev,
       k01_gyariszam,
       k01_leltszam,
       prsn_name,
       k00_status,
       tstikon,
       k00_startflow,
       tstname,
       k00_eszkozid,
       k01_gyariszam,
       k01_leltszam
FROM   karton00
       LEFT JOIN karton01
              ON k00_eszkozid = k01_eszkozid
                 AND k01_status = 'A'
       LEFT JOIN karton02
              ON k00_eszkozid = k02_eszkozid
                 AND k02_status = 'A'
       LEFT JOIN karton04
              ON k00_eszkozid = k04_eszkozid
                 AND k04_status = 'A'
       LEFT JOIN karton05
              ON k00_eszkozid = k05_eszkozid
                 AND k05_status = 'A'
       LEFT JOIN karton06
              ON k00_eszkozid = k06_eszkozid
                 AND k06_status = 'A'
       LEFT JOIN karton08
              ON k00_eszkozid = k08_eszkozid
                 AND k08_status = 'A'
       LEFT JOIN karton09
              ON k00_eszkozid = k09_eszkozid
                 AND k09_status = 'A'
       LEFT JOIN telephely et
              ON k06_telephelyid = et.telepid
       LEFT JOIN ktghely00 ek
              ON k02_ktghid = ek.ktghid
       LEFT JOIN person00 us
              ON k06_userid = prsn_id
       LEFT JOIN ktghely00 fk
              ON prsn_ktgh = fk.ktghid
       LEFT JOIN telephely ft
              ON prsn_telep = ft.telepid
       LEFT JOIN tamstatus
              ON k02_tamstatusid = tstid
       LEFT JOIN szakleltar
              ON k02_szakleltarid = szleltid
       LEFT JOIN tamszerv
              ON k02_tamszervid = tszid
       LEFT JOIN ktghely01
              ON k02_vgazdaid = vgid
                 AND vgstatus = 'A'
       LEFT JOIN ktghely00 vk
              ON vgktghid = vk.ktghid
       LEFT JOIN szallitok m
              ON k05_mincegid = m.szallid
       LEFT JOIN szallitok s
              ON k04_szallitoid = s.szallid
       LEFT JOIN dctnry00 ym
              ON k05_minosit = ym.dctnryname
                 AND ym.dctnrygrp = 'YESNO'
       LEFT JOIN dctnry00 yd
              ON k05_check = yd.dctnryname
                 AND yd.dctnrygrp = 'YESNO'
WHERE  k00_status IN ( 'A', 'H' )
       AND ( k02_vgazdaid IN ( 7 ) )
       AND NOT EXISTS (SELECT *
                       FROM   eszkozkizar
                       WHERE  ez_flid = 0
                              AND ez_emintaid = k00_eszkozmintaid
                              AND k00_uzembedatum < ( Date_add(Curdate(),
                                                      INTERVAL ez_honap month) )
                              AND k00_uzembedatum != ''
                              AND k02_vgazdaid NOT IN ( 7 ))
       AND NOT EXISTS(SELECT *
                      FROM   eszkozkizar
                      WHERE  ez_flid = 0
                             AND ez_emintaid = k00_eszkozmintaid
                             AND k02_tamszervid = ez_tamszerv
                             AND k02_tamstatusid = ez_tamsts
                             AND k00_uzembedatum < ( Date_add(Curdate(),
                                                     INTERVAL ez_honap month) )
                             AND k00_uzembedatum != ''
                             AND k02_vgazdaid NOT IN ( 7 ))
ORDER  BY k00_eszkoznev ASC; 

【问题讨论】:

  • 清理和格式化你的问题怎么样?
  • 您能否帮助我们理解为什么您要多次将表加入到自身中?也许给我们一个样本数据集,其中包含您想要获得的结果,我们可以建议一种更好的方法来解决您的问题。
  • 另外,除了所有的连接之外,你应该将你的列限定为 table.column 以便我们知道查询中真正涉及的内容,以及额外的表是否真的不适用(通过左连接) ,为什么要包括它们。
  • 您似乎缺少karton03。任何时候出现&lt;tablename&gt;&lt;number&gt; 模式,我都会担心设计问题。

标签: mysql sql join indexing


【解决方案1】:

您也可以使用USE INDEX (index_list) 声明:http://dev.mysql.com/doc/refman/5.5/en/index-hints.html

【讨论】:

  • 除非您知道事实指定特定索引会有所帮助,否则最好让优化器为您完成工作。任何带有这些需要的语句都需要定期审查,以确保数据库更改不会使其他东西成为更好的选择(这就是为什么有优化器的原因)。这种类型的事情相当于总是沿着特定的道路行驶(或先选择它)......不管交通状况、新道路、绕道,甚至可能你的目的地移动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2018-02-09
  • 1970-01-01
  • 2013-10-29
  • 2016-06-24
相关资源
最近更新 更多