zoukankan      html  css  js  c++  java
  • mysql 日期与索引问题

    日期类型可以直接和string格式的字符串比较

    select * from xxx where event_time>'2018-06-02' 可以使用索引, mysql默认会把后面的字符串转成date类型。可以使用between and

    select * from xxx where date(event_time)>'2018-06-02'   不能使用索引

    如果时间戳日期和时间都要比较, 最好使用两个字段保存这个时间戳, 这样可以利用索引

    select * from xxx where event_time>1239237428734; --  使用错误, 不能这么用。可以使用from_unixtime()将数字转成日期类型

     将date和time合并成一个datetime

    select str_to_date(concat(ICDate,' ',ICTime),'%m/%d/%y %h:%i:%s %s')   from XXXX

    参考: https://stackoverflow.com/questions/2758486/mysql-compare-date-string-with-string-from-datetime-field

    其他索引总结:

    where条件等号两边字段类型不同,不走索引

    like 'XXX%' 走索引, '%XXX%'不走索引

    对字段进行函数运算不走索引

    组合索引 只使用后面的字段不走索引,使用前后的字段走索引. 第一个字段有参于(而且字段类型匹配 没有函数运算),那么会走索引, 第一个字段可以在sql中的任意位置

     组合索引遇到第一个不等值条件 即中断后面字段使用索引

     字段类型不匹配,不走索引

     示例:

    name varchar, addr varchar, age int。 创建组合索引为name + addr + age

    select * from t_user where name like '123%' and age>19;  走索引 type=range

    select * from t_user where age>19 and name like '123%' ;  走索引 type=range

    select * from t_user where name =123 不走索引 type=all

    select * from t_user where name='123' 走索引 type=ref

    select * from t_user where addr like '上城%' and age>30; 不走索引 type=all

    explain 是否使用了索引

    type=ALL是全表扫描

    只要不是ALL, 都能使用索引,只是使用索引的方式不同,性能也有差异==>依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL

    关于explain各个字段的解释:https://www.cnblogs.com/david97/p/8072164.html

    索引不是越多越好, 两个index进行merge有时还不如只使用一个index

    组合索引创建的依据:select distinct(xxx)/count(*) 值越大说明区分度越高 组合索引的价值越高 

    什么时候创建组合索引? 

    单列上查询出来的数据量都很大,但是两个组合查询的结果很小 ,此时创建组合索引就比较有意义

     (原始的离线度都小,组合的离散度会大???)    0.8*0.8=0.64       0.8*0.5=0.4    如果整体的数据量级别很大,也有点效果

      

    key_len 是组合索引使用的多个字段长度计算而来, 越大索引利用越好

     只看explain中的type 还不够,  还要看看rows ,  为什么使用了索引后 rows还是这么大呢?  有可能是类型转换 ,  但是explain没有显示出来, 使用show warnings 看看到底用没用索引

    orderby 是否使用索引

    https://my.oschina.net/u/912810/blog/325177

    orderby  groupby用到的索引和where中的索引如果一致, 可以提升不少性能

     orderby  using filesort

     groupby 子查询  using temp table

    字符类型的索引需要指定长度

    ALTER TABLE t_yyy ADD INDEX `xxx` (`request_type` ASC, `request_param`(15) ASC);

    left join索引是加在左表上,     左表使用小表,    被join的表索引是加在where on条件上  

    索引的类型

     BTREE的时间复杂度: https://blog.csdn.net/weixin_38399962/article/details/79409118

  • 相关阅读:
    【PHP】php基础回顾
    【PHP】MVC架构
    【OpenGL学习】使用VBO和FBO
    【OpenGL学习】使用Shader做图像处理
    hdu 杭电 1242 Rescue 果枫
    并查集模板 果枫
    数组结构体中排序 果枫
    hdu 杭电 1728 逃离迷宫 果枫
    hdu 杭电 1241 Oil Deposits 果枫
    hdu 杭电 2216 Game III 果枫
  • 原文地址:https://www.cnblogs.com/yszzu/p/9255769.html
Copyright © 2011-2022 走看看