mysql查询中利用索引的机制_MySQL

WBOY
リリース: 2016-06-01 13:16:37
オリジナル
1184 人が閲覧しました

    今天遇到一个奇怪的问题,明明已经建立了索引,select语句的explain也表明会利用这个索引,可是结果偏偏没有用索引,最后扫描了全表。

    两个结构完全一样的sql语句:

     sql1: select * from table where col_a = 123 and col_b in (‘foo’,/'bar’) order by id desc;

    sql2: select * from table where col_a = 456 and col_b in (‘foo’,/'bar’) order by id desc;

    结果sql1选择利用了col_a的索引,速度很快,sql2利用了主键ID的索引,扫描了全表(40w行)。

    仔细分析,发现数据库中,col_a=456的记录数有近1万条,而col_a=123的记录数只有几条。

    于是就清楚了,mysql选择索引不仅仅依据查询结构和索引结构,还会根据索引大概估算选择每种索引的数据量,然后选择他认为最快的索引。

    可能是主键索引会比普通index更快,所以mysql最后选择了数据量跟大的id索引。

    那么,如何解决这个问题呢?

     很简单,只要在order语句里写多个键即可,比如:order by col_a, id desc

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート