MySQL使用">="或"<="范围查询时不走索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL使用">="或"<="范围查询时不走索引相关的知识,希望对你有一定的参考价值。

参考技术A 2020-02-27
最近一个日志页面查询很慢,然后去跟踪了查询sql,发现日期字段上即使建了索引,查询还是很慢,执行语句还是使用了全表扫描,于是继续分析下去。
查询语句类似:
select * from logs where createtime >= '2020-01-01' ;
起初因为date上没检索,查询执行的是全表扫描,给条件字段createtime建上索引:

再次执行:

查询执行的还是全表扫描:

网上查询有说是因为在查询数据条数约占总条数五分之一以下时能够使用到索引,但超过五分之一时,使用全表扫描。于是把日期范围缩小:

果真,查询执行的是range:

由此可知,在进行范围查询时,比如:>、< 、>=、<=等, 如果数据量过大的话,即使where条件字段已经建立了索引,查询语句执行时还是有可能进行全表扫描的。
实际上是不是全表的五分之一以下才会使用索引,这个不能确定,以后再研究了。

C# POST方式提交数据,接收方式,使用Request.Form[""]或Request[""]来获取

  /// <summary>
        /// 调用接口
        /// </summary>
        /// <param name="url"></param>
        /// <param name="dic">提交的参数</param>
        /// <returns></returns>
        public string Post(string url  , Dictionary<string, string> dic)
        
            string result = "";

            //添加Post 参数
            System.Text.StringBuilder builder = new System.Text.StringBuilder();
            int i = 0;
            foreach (var item in dic)
            
                if (i > 0)
                    builder.Append("&");
                builder.AppendFormat("0=1", item.Key, item.Value);
                i++;
            
            byte[] postData = System.Text.Encoding.UTF8.GetBytes(builder.ToString());

            System.Net.HttpWebRequest _webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
            _webRequest.Method = "POST";
            //_webRequest.ContentType = "application/json";
            //内容类型  
            _webRequest.ContentType = "application/x-www-form-urlencoded";
            _webRequest.Timeout = 1000 * 30;
            _webRequest.ContentLength = postData.Length;

            using (System.IO.Stream reqStream = _webRequest.GetRequestStream())
            
                reqStream.Write(postData, 0, postData.Length);
                reqStream.Close();
            

            System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)_webRequest.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            //获取响应内容
            using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8))
            
                result = reader.ReadToEnd();
            
 
            return result;
        

 

//调用接口
var para = new Dictionary<string, string>();
 para.Add("UserId", "33699");
 para.Add("pwd", "123456");
 string postResult = Post("http://", para);

以上是关于MySQL使用">="或"<="范围查询时不走索引的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySql MsSql 如何插入或更新 ['] 或 ["] 或 [`] 字符?

如何在 Mysql X DevAPI 中查询 Null 或 Missing 字段?

Mysql 动态sql foreach 使用案例

急!将mysql中日期转化为时间戳

使用logstash同步mysql 多表数据到ElasticSearch实践

使用logstash同步mysql 多表数据到ElasticSearch实践