Heim  >  Fragen und Antworten  >  Hauptteil

In Bezug auf Probleme mit der Effizienz von MySQL-Indexabfragen

SELECT COUNT(*) FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN ('0','2','21','22','27','11','31') AND `empty` = 0 LIMIT 1 [ RunTime:0.1423s ]
SELECT `id`,`webid`,`catid`,`path`,`pname`,`pathall`,`title`,`cdn`,`sort`,`likecount`,`fsize`,`time`,`viewcount`,`likecount` FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN ('0','2','21','22','27','11','31') AND `empty` = 0 ORDER BY time desc,id desc LIMIT 0,10 [ RunTime:0.0045s ]

Zwei SQL-Anweisungen, die letzte Laufzeit bedeutet Ausführungszeit, das Datenvolumen beträgt 150 W

Feldbeschreibung zhuanid ist ein numerischer Wert, webid ist ein numerischer Wert, leer ist 0 oder 1

Der von SQL im ersten Satz verwendete gemeinsame Index ist ein Satz von Indizes für zhuanid webid empty.
Der von SQL im zweiten Satz verwendete Index ist ein Satz von Indizes für zhuanid webid empty

Warum dauert die Zählung im ersten Satz so lange? Im Vergleich zur komplexen Abfrage im zweiten Satz dauert sie sehr kurz

世界只因有你世界只因有你2675 Tage vor1045

Antworte allen(4)Ich werde antworten

  • ringa_lee

    ringa_lee2017-06-22 11:56:39

    第一句sql, limit 1
    第二句sql, limit 0, 10
    你让count去数150w条....还想比查看前10条快?

    Antwort
    0
  • PHP中文网

    PHP中文网2017-06-22 11:56:39

    我的猜测:索引字段没有设置不可为空,导致 count(*) 没有使用到索引。

    另外这两条语句本身并不等价,第一条针对全表,第二条不是,好像没啥可比性

    Antwort
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-22 11:56:39

    要看一下你的执行计划 第一条sql结果集很大的情况下是需要扫描所有符合条件的记录的 这种情况下第二条sql走time id的索引只需要找到10条满足条件的记录即可 所以会比较快 另外zhuanid webid empty的组合索引也只会使用到zhuanid列和webid的range部分 可以修改索引顺序为zhuanid empty webid

    Antwort
    0
  • 为情所困

    为情所困2017-06-22 11:56:39

    第一条SQL执行后,结果保存在Cache.

    第二条SQL执行,依赖了第一条SQL的Cache,所以会更快(其实第二条SQL用了排序,应该更慢才对).

    楼主可以在第一条SQL执行完后,执行

    RESET QUERY CACHE;
    

    重置Cache,然后在执行第二条SQL,结果是不一样的.

    Antwort
    0
  • StornierenAntwort