• mysql索引、group by、explain、insert delayed


    1、explain
    将explain关键字加在sql语句前,将会列出详细的性能信息。
    a、table:指明表名
    b、type:连接类型,从最好到最差依次是:system,const,eq_ref,ref,range,index,ALL,possiable_key
    c、key:显示mysql实际决定使用的键,如果没有索引被选择,将为null
    d、key_len:mysql决定使用的键长度
    f、ref:显示那个列或常熟与key一起从表中选择行
    g、rows:执行查询的行数
    rows<1000,是在可接受的范围内的。
    rows在1000~1w之间,在密集访问时可能导致性能问题,但如果不是太频繁的访问(频率低于1分钟一次),又难再优化的话,可以接受,但需要注意观察
    rows大于1万时,应慎重考虑SQL的设计,优化SQL,优化db,一般来说不允许频繁运行(频率低于1小时一次)。
    rows达到10w级别时,坚决不能做为实时运行的SQL。但导数据场合除外,但导数据必须控制好时间,频度。
    h、extra:如果是only index,则表明信息从索引树中检索得到。这要比扫描整个表快。如果包括文字,where userd,它意味着一个where子句将被用来限制那些行与下一个表匹配或发向客户。
    通过相乘rows列输出的所有值,可以粗略确定mysql检验多少行以执行查询。
    2、delayed
    使用insert delayed into tablename values(...),可以延迟插入数据。
    用delayed标示过的insert语句将被放入服务器的内存中,形成一个队列,等待插入。何时插入,取决于mysql是否有读行为,如果没有,将执行真正的插入。如果有,将被挂起。直到没有读行为,才插入。如果服务器崩溃或mysql被强行kill,等待插入的队列丢失。
    3、procedure analyse()
    使用procedure analyse(),将给出每个列最好的类型建议。
    使用方式:select * from procedure analyse()
    4、一些重要的参数:
    delayed_queue_size:使用insert delayed来执行插入时,确定放入的数目
    key_buffer_size:索引块的缓存区大小,如果内存够大,可以适当加大该值
    back_log:客户机连接请求的数量
    read_buffer_size:读操作用的缓存大小
    write_buffer_size:写操作用的缓存大小
    sort_buffer_size:排序用的缓存大小
    5、索引
    a、索引最好在myisam表上使用
    b、一个复合索引最多包含16个列
    c、确定一个列是否适合做索引,看select count(distinct  colname)/count(*) from table
    如果该值接近0.31就适合做索引(当然越大越好),如果接近0则不适合做索引,也就是说该列没有太多的唯一值,而是有太多的重复值,这样将不适合做索引.

    前缀索引不能用于order by和group by
    d、对于索引使用列部分做索引,性能将得以优化
    f、对于一个sql语句最适合做索引的是where部分和order by部分
    h、全文索引:适合的字段类型为char、varchar、text
    select title from table where match(title,contet) against('part');
    需要注意part,长度如果小于4则停止搜索(当然可以更改此参数);part是以单词(单词分割为空格,逗号等)为单元来搜索,即如果1条记录中含有part,则part必须是个独立的单词,如depart则不能被搜索出来。
    全文索引不能很好的支持中文。
    如果每条记录都含有part,则没有结果被搜索出来(原因是频度必须小于50%)。
    6、group by和having
    group by以某列为条件分组
    select count(*) from table group by cid;
    having则选择符合条件的
    select count(*) from table group by cid having count(*)>1000;
    以cid分组,并选取每组记录总数大于1000的

    7、使用optimize table tablename优化表

    8.join

    select * from A join B using(col1,col2);

    等同于select * from A join B on A.col1=B.col1 and A.col2=B.col2

  • 相关阅读:
    Android全局变量的定义与使用
    安卓4.0/4.1/4.2手机怎么打开USB调试模式
    Android中的DDMS进行调试
    Runtime.getRuntime().exec执行阻塞问题解决
    GC_EXTERNAL_ALLOC freed 与 GC_EXPLICIT freed 是什么?
    [基础]Android 应用的启动
    Android popupwindow 失去焦点或者点击空白区域时消失的解决方法
    [问题]Android listView item edittext 不能调用软键盘输入法
    Android greenDAO 数据库 简单学习之基本使用
    Java 找出四位数的所有吸血鬼数字 基础代码实例
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4429505.html
Copyright © 2020-2023  润新知