mysql之技巧

一、mysql基础知识

    (1)、mysql统计行数量count(*)、count(1)和count(列名)有什么区别?

在InnoDB中COUNT(*)和COUNT(1)实现上没有区别,而且效率一样,但是COUNT(字段)需要进行字段的非NULL判断,所以效率会低一些。
因为COUNT(*)是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)查询表的行数!

     (2)、mysql插入语句之value与values区别?

应该在插入单行的时候使用VALUES,在插入多行的时候使用VALUE

     (3)、mysql中添加或插入语句(Insert)的几种使用方式?

         1、INSERT 简写方式插入数据(不推荐)

使用Inset into 表名 values(值1,值2)进行插入,并对查看插入数据是否成功
注意:insert这种简写的方式虽然非常简单,但是Values后面的值必须和表中的类顺序对应,且类型要保持一直,即使表中某一个列不需要值也必须赋值为null,
比如我们的主键id设置的是递增实际上是不用设置值的,但是使用这种方式必须赋值为null 不推荐的原因:在实际开发中如果使用此方法进行插入数据,后面表进行了改动(比如字段顺序改变了)那么整个语句都将报错,扩展性及其差,且维护起来比较困

         2、INSERT 完整写法(推荐)

使用Inset into 表名(字段1,字段2) values(值1,值2)进行插入,并对查看插入数据是否成功。
推荐使用的原因:这一次我们设置了没有给id赋任何值包括null,而且不用关心表中字段的顺序,比如下面不按照正常顺序添加,
我们将age放在第一,name放在第二个.也能添加成功;需要注意的是表名后面的字段名必须和后面values赋的值保持一致;实际开发中在维护和扩张方面都比方案一要好

         3、REPLACE INSERT语句和INSERT IGNORE INTO 语句

此语句的作用是当我们在插入一条数据时,如果此条已经存在,那么先删除原来存在的数据再添加插入的数据,如果不存在那么直接插入新的数据。
使用Inset into 表名(字段1,字段2,字段3) values(值1,值2,值3);Inset into 表名(字段1,字段2,字段3) values(值1,值2,值3)进行插入。
注意:却分是否存在是通过主键来确定的。

  (4)、from多表关联和inner join多表关联的区别?

from多表关联是老SQL标准,inner join关联是新SQL标准。
从结果上看一样。但是从实现上看,多个from是迪卡尔集,再筛选,效率是O(n^2),很差。join是先做hash,再匹配,效率是O(logN)

二、mysql进阶优化

     (一)、mysql索引有哪些类型和如何避免索引被破坏?

             1、索引类型?

普通索引、唯一索引、主键索引、组合索引、全文索引、空间索引

             2、如何避免索引被破坏?

    原则:第一个索引不能掉、中间索引不能掉

  • 当你使用索引的时候,最好能够把你建立的索引的字段都给用到。不仅可以提供查询的效率。
  • 最佳左前缀法则,意思就是当你如果有建立过多个字段索引的组合索引的时候,最要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不能跳过索引中的列。
  • 不在索引列上做任何操作(计算、函数(自动or手动)类型转换),会导致索引失效而转向全表扫描。
  • 存储引擎不能使用索引中范围右列的列,范围之后索引全失效。
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询一致)),减少select *
  • mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。
  • is null,is not null也无法使用索引,所以表中的数据应该不能为NULL。
  • like以通配符开头('%abc...')或者('%abc%...'),mysql索引失效会变成全表扫描的操作,使用('abc%')索引不失效
  • 字符串不加单引号索引失效。
  • 少用or,用它来连接时会索引失效。

 

posted @ 2020-08-21 15:23  爱编程1314  阅读(111)  评论(0编辑  收藏  举报