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

WBOY
풀어 주다: 2016-06-01 13:16:37
원래의
1177명이 탐색했습니다.

    今天遇到一个奇怪的问题,明明已经建立了索引,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으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿