1. SQL模糊查询
- like: 效率低,容易全盘扫描
 
  
   - 
    
     
    
    
     
      # 查找Name中包含字符'M'的数据
     
    
 
   - 
    
     
    
    
     
      select ename 
      from table 
      where ename 
      like 
      '%M%'
     
    
 
   - 
    
     
    
    
     
      # 查找Name中第二个字母为'M'的数据
     
    
 
   - 
    
     
    
    
     
      select ename 
      from table 
      where ename 
      like 
      '_M%'
     
    
 
  
 
- instr(str, substr) / locate(substr, str) / position(substr in str): 效率也低
 
  
   - 
    
     
    
    
     
      select ename 
      from 
      table 
      where 
      instr(ename, 
      'M')
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      select ename 
      from 
      table 
      where 
      locate(
      'M', ename)
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      select ename 
      from 
      table 
      where 
      position(
      'M' 
      in ename)
     
    
 
  
 
- find_in_set:关键词匹配
 
select ename from table where find_in_set('M' in ename) 
2. 单行处理函数 ifnull :空处理函数
  
   - 
    
     
    
    
     
      # 分组函数 如sum会自动忽略NULL
     
    
 
   - 
    
     
    
    
     
      select ename, ifnull(game_pay, 
      0) 
      as game_pay 
      from table
     
    
 
  
 
3. count(*) 和 count(field)
- count(*):统计总记录条数(和某个字段无关)
 - count(field):字段中部位NULL的数据总数量
 
4. having
- group by:按照某个字段或者某些字段进行分组
 - having:对分组之后的数据进行再次过滤(如果可以使用where 就优先使用)
 
  
   - 
    
     
    
    
     
      # 效率低下
     
    
 
   - 
    
     
    
    
     
      select max(sal), deptno from table group by deptno having sal>20000
     
    
 
   - 
    
     
    
    
     
      # 效率较高
     
    
 
   - 
    
     
    
    
     
      select max(sal), deptno from table where sal>20000 group by deptno
     
    
 
   - 
    
     
    
    
     
      
     
    
 
   - 
    
     
    
    
     
      ## where 搞不定情况 /// where后面不准使用分组函数
     
    
 
   - 
    
     
    
    
     
      select deptno, avg(sal) from table group by deptno having avg(sal) > 20000
     
    
 
  
 
5. 数据分区vs分表
- 问题来源:
 
很多同事说,在mysql 表中建立分区,能够提高查询效率。如果是以主键id分区可以减少查询的范围! 但是,也有同事说,分区更重要的对数据的管理。 比如,保留三个月有效数据;可以根据时间字段分区,将三个月前的 数据清就等于直接清除分区!所以,数据分区是为了提高查询效率 还是 为了方便数据管理?
- 知乎解释:
 
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
1. 关于分表:
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
2. 关于分区:
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
3. 分表与分区的联系:
a. 都能提高mysql的性高,在高并发状态下都有一个良好的表现。
b. 分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
c. 分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。
d. 表分区相对于分表,操作方便,不需要创建子表。
- 结论
 
两种说法都对。
转载:https://blog.csdn.net/shenziheng1/article/details/103843760