zoukankan      html  css  js  c++  java
  • mysql 相关语句及优化

    使用EXPLAIN查看mysql是如何处理sql语句的,查找性能问题点

    生成随机字符

    char(if(floor(rand()*2)=0,65+floor(rand()*26),48+floor(rand()*9)))

    生成随机汉字

    unhex(hex(19968+rand()*40868))

    生成随机数字

    RAND()*10000

    循环操作

    delimiter 
    create procedure rantw() 
    begin 
    declare num int; 
    set num=1; 
    while num < 10000 do 
    insert into test(name,title,count) values(char(if(floor(rand()*2)=0,65+floor(rand()*26),48+floor(rand()*9))),RAND()*10000,1) ; 
    set num=num+1;
    end while;
     end
    

      

    use ecommerce;
    DROP PROCEDURE IF EXISTS ecommerce.BatchInsertCustomer;
    delimiter 
    CREATE PROCEDURE BatchInsertCustomer(IN start INT,IN loop_time INT)
    BEGIN
     DECLARE Var INT;
     DECLARE ID INT;
     SET Var = 0;
     SET ID= start;
          WHILE Var < loop_time 
            DO
          insert into test(`name`,title,count) 
      values(CONCAT('name_',rand(ID)*10000 mod 200),adddate('1995-01-01',(rand(ID)*36520) mod 3652),RAND()*100000);
          SET Var = Var + 1;
          SET ID= ID + 1;
          END WHILE;
    END;
    
    delimiter ; 
    
    
    ALTER  TABLE  test  DISABLE  KEYS
    
    CALL BatchInsertCustomer(100000,2000000);
    
    ALTER  TABLE  test  ENABLE  KEYS;
    

      

    MySql快速插入100w条数据方法

    1、使用文件运行,通过程序,生成100w条数据至文件,利用mysql运行方式运行。

    2、JAVA程序中使用多线程插入

    3、通过事务控制,预处理sql,在达到指定数量的时候提交一次

    SQL优化

    统计表总数

    -- 使用第二索引
    -- 通过统计全表记录数时在where后面加一个有索引的字段作为条件来查询全表数据,如:
    --  2-4s
    select count(*) from test;
    -- 4.650
    select count(id) from test;
    -- 7.990
    select count(1) from test;
    -- 3.860
    select count(count) from test where count > 0;
    -- count 不为主键,count 有索引
    

      

    索引

      对于任何DBMS,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。
    如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:
    假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。但是,查询语句select * from t1 where c2=2不能够使用该索引,因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

    事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

      1、全文索引

        表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)

        MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

        注:目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。

    全文索引的缺陷: 
      数据表越大,全文索引效果好,比较小的数据表会返回一些难以理解的结果。

       全文检索以整个单词作为匹配对象,单词变形(加上后缀,复数形式),就被认为另一个单词。

       只有由字母,数字,单引号,下划线构成的字符串被认为是单词,带注音符号的字母仍是字母,像C++不再认为是单词

       不区分大小写

       只能在MyISAM上使用

      全文索引创建速度慢,而且对有全文索引的各种数据修改操作也慢

    乱七八糟的,真正吃透在整理吧

  • 相关阅读:
    Collections和Arrays常用方法
    集合(三)------双列集合
    集合(二)------单列集合
    集合(一)----------概述
    泛型
    线程
    Math类和Random类(数学公式相关类)
    时间相关的类
    Runtime类及其常用方法
    第65题:有效数字
  • 原文地址:https://www.cnblogs.com/binbang/p/6419738.html
Copyright © 2011-2022 走看看