mysql基础操作sql技巧和sql的常见优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql基础操作sql技巧和sql的常见优化相关的知识,希望对你有一定的参考价值。

一、常见操作

1、复制表结构create table t2 like t1

   复制表数据insert into t2 select * from t1

2、mysql索引
   alter table用来创建普通索引、unique索引或primary key索引
   alter table t add index index_name(column_list)
   alter table t add unique(column_list)
   alter table t add primary key(column_list)
    
   create index index_name on table (column_list)
   create unique index index_name on table(column_list)

   drop index index_name on t
   alter table t drop index index_name
   alter table t drop primary key

   alter table t modify id int not null
   show index form t

3、视图
   create view v as select * from t where id>5
   insert into t(name) values("user"),("user1")
   ?

view | ? index
   alter view | create view | drop view
   一旦与视图关联的表损坏,则视图会错误发生
4、内置函数
   字符串:
    concat("hello","world") as hw 链接字符串
    lcase("GAFG")//转小写
    ucase("jjj")
    length(string) //长度
    ltrim(string)   //去掉前端空格
    rtrim(string) //去掉右端空格
    repeat(string,count)//反复count次
    replace(string,s1,s2)//在string中把s1替换成s2
    substring(str,position,[length])//在str中,从position開始取length个字符
    space(count) 生成count个空格

   数学函数:
    bin(number) //十进制转二进制
    ceiling(number)//向上取整
    floor(number) //向下取整
    max(num1,num2)//取最大值
    min(num1.num2)
    sqrt(number)//开平方
    rand() //返回0-1内的随机值
   日期函数:
    curdate()//返回当前日期
    curtime()
    unix_timestamp(date)//返回当前date的
    week(date)//返回date为一年中的第几周
    year(date)//返回日期date的年份
    datediff(expr,expr2)//两个时间之间的间隔天数


5、mysql预处理语句
   设置stmt1预处理:
   prepare stmt1 from ‘select * from t where id>?


   设置一个变量: set @i = 1;
   运行stmt1预处理:execute stmt1 using @i
   set @i=5
   execute stmt1 using @i
    删除预处理:drop prepare stmt1

 
6、 mysql事务处理
    关闭自己主动提交功能:set autocommit=0。
    delete from t where id = 11;
    savepoint p1;
    delete from t where id = 12;
    savepoint p2;
    rollback to p1;
    rollback;//还原到最原始的还原点

    alter table t engine=innodb。//事务控制仅仅对innodb引擎实用

7、mysql存储procedure
    create procedure p2()
    begin
    set @i = 3;
    while @i<=10  do
    insert into t(name) values(concat(‘hh‘,@i));
    set @[email protected]+1;
    end while;
    end;

    shwo create procedure p2;
    call p2;

8、mysql 触发器
    create trigger tg before insert on t for each row
    begin insert into t2(name) values(new.name)
    end

    create trigger tg before delete on t for each row
    begin delete from t2 where name = old.name
    end

9、重排auto_increment
   清空表的时候用truncate
   alter table t auto_increment = 1;

二、常见sql技巧
 1、正則表達式的使用(和其它语言一样)
    select "linux is very good!" regexp ".*"//匹配全部
    select "linux is very good!" regexp "^linux"
    select email from user where emial regexp "@163[.,]com$"
    =
    select email from user where emial like ‘%@163.com$‘ or emial like ‘%@163,com$‘

 2、巧用rand()提取随即行
     0-1之间的随机数函数 select rand()*100
     select * from t order by rand();//随即排列表数据
     select * from t order by rand() limit 3;//取出三条随即样本
 3、利用group by的with roolup字句统计,不能够和order by使用
     能够检索出很多其它的分组聚合信息
     select * from t;
     select * ,count(*)from t group by c1,c2//先对c1聚合
     select * ,count(*)from t group by c1,c2 with roolup
 4、用bit group functions做统计
     在使用group by语句时能够使用bit_and、bit_or函数来完毕统计工作。这两个函数的作用主要是做数值
     之间的逻辑位运算。
     select id,bit_or(kind) from t group by id
 5、使用外键须要注意的问题
     create table t (id ,name,foreign key(id) references t1(id) on delete cascade on update cascade)
     innodb类型的表支持外键。myisam类新的表尽管创建外键能够成功。可是不起作用,主要原因是不支持外键。


 6、mysql中help的使用
     ? %
     ? create
     ? opti%
     ? reg%
     ? contents     mysql中全部的帮助信息


三、sql优化
  1、优化sql语句的一半步骤
    show status了解各种sql的运行频率
    show [session|globe] status;
    show global status;
    show status like ‘com_%‘
    show global  status like "com_%"

    仅仅针对innodb存储引擎的:
       innodb_rows_read 运行select操作的次数
       innodb_rows_updated\inserted\deleted
    show variables like ‘slow%‘
    show variables like ‘long%‘
    show status like connections链接mysql的数量
    show status like uptime server已经工作的秒数
    show status like slow_queries慢查询的次数

    定位运行效率低的sql语句
    explain/desc select * from table where id>10
    desc select * from table where id>10\G
  2、索引问题
    常见优化手段之中的一个
    myisam存储引擎的数据和索引时自己主动分开存储的。分别是独一的一个文件
    innodb存储引擎的表的数据和索引是存储在同一个表空间里面,但能够有多个文件组成
    mysql不支持函数索引,可是能对列的前面某一部分进行索引,比如name字段,能够对name的
  前4个字符进行索引,这个特性能够大大缩小索引文件的大小
    create index index_name on t (name(4))
    mysql索引用于高速查找出某一个列中有定特定值的行,对相关列使用索引时是提高select操作性能的最佳途径
    1、使用索引
       对于创建多列索引,仅仅要查询的条件中用到最左边的列,索引通常会被使用
       create index iname on t (name,age)//符合索引
    2、存在索引可是不使用索
     假设mysql预计使用索引比全表扫描慢,则不使用索引,比如keypart均匀分布在1-100之间。查询时使用索引就不是非常好
     eg:select * from t where keypart>1 and keypart<99
     假设使用t表而且where条件中不使用=进行索引列。则不使用到索引。
     用or分隔开的条件假设or前的条件中的列有索引。后面的列中没有索引,
则涉及到的索引都不会用到。索引都须要用索引
     假设列类型是字符串,可是在查询的时候把一个整数型常量付给了字符型的列name。那么在name列上有索引也不会用到
    
    3、经常使用sql的优化
      大批量插入数据:infile outfile
    当用load命令导入数据的时候,适当设置能够提高导入的速度。


    4、经常使用的sql优化
   insert语句,尽量使用多个值表的insert语句。这样能够大大缩短客户与数据库连接关闭的消耗
   能够使用insert delayed语句得到更高的效率























































































































































































以上是关于mysql基础操作sql技巧和sql的常见优化的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# MySQL性能优化:常见优化SQL的技巧

《深入浅出Mysql》——第三篇 优化篇 第十七章 常用SQL技巧和常见问题 + 第十八章 SQL优化 + 第十九章 优化数据库对象

mysql基础知识点二-mysql sql优化

Mysql sql语句技巧与优化

Web安全黑铁到传说四.常见漏洞攻防之SQL注入基础详解(权限提升绕过技巧注入技巧)

MySQL基础(DDLDMLDQL)