首页 > 数据库 >MySQL千万级数据库查询怎么提高查询效率

MySQL千万级数据库查询怎么提高查询效率

时间:2023-11-09 20:45:43浏览次数:40  
标签:name 千万级 查询 索引 num MySQL where like

 查询效率慢的原因:  1:没有加索引或者索引失效     where条件使用如下语句会索引失效:null、!=、<>、or连接、in(非要使用,可用关键字exist替代)和not in、'%abc%';     使用参数:num=@num、表达式操作:where num/2=100、函数操作:where substring(name,1,3)=‘abc’-name;       --exist代替in     select id from table where num exist(1,2,3,4,5,6)     --where字句使用or连接条件的替代方案     select id from table where num=10     union     select id from table where num=20;           --连续的数值,能用between就不要用in     select id from table where num between 1 and 3;           --使用参数的替代方案     --如果在where子句中使用参数(num = @num;),也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引的输入项。     select id from table where num=@num;     替代为:强制查询使用索引:     select id from table with(index(索引名)) where num=@num;           --使用表达式的替代方案     select id from table where num/2=100;     替代为     select id from table where num=100*2;           --使用函数操作的替代方案     select id from t where substring(name, 1, 3) = ’abc’–name; //以abc开头     替代为     select id from t where name like ‘abc%’;//单个百分号   2:查询的数据量过大,返回不必要的行和列       只查询有用的字段,不要用*查询出所有字段。     采用多线程多次查询。如果查询条件是某段时间之类的范围条件,可以把时间条件切分,多次查询结果合并。   3:锁或者死锁   4: I/O吞吐量小,形成瓶颈效应。   5:内存不足。       少造对象,对象只在需要使用时创建,不要在整个上下文传递。     及时清理jvm内存。   6:网络速度慢。 一些SQL优化方法   1:如果索引是复合索引,必须使用该索引的第一个字段作为条件才能保证系统使用该索引,否则索引不会被引用,并且应尽可能的让字段顺序与索引顺序一致。   2:索引并不是越多越好,一个表索引最好不要超过6个。索引固然可以提高select效率,但是也降低了insert效率和update效率,因为insert和update会使索引重建,所以怎么建索引需要慎重考虑。   3:建表的一些优化:       尽量使用数字型字段,若数据只含有数值信息尽量不要设计成字符型,这会降低查询和连接的性能,并会增加存储开销。因为引擎在处理查询和连接时会逐个比较字符串中每个字符,而对于数字型而言只需比较一次就够了。     尽量使用varchar/nvarchar代替char/nchar,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高一些。   4:任何地方都不要使用select * from table,用具体的字段列表代替*,不要返回用不到的任何字段。   5:尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。(游标是很老的功能了,几乎废弃了。)   6:并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。   7:尽量避免大事务操作,提高系统并发能力。 注意事项:   1:使用like时,一定要记得判空   ... where  name like ‘%’.变量名.'%';    (变量值是从外面传进来的)   如果:变量是空,就变成如下sql   ...where name like '%%';      --   这个条件造成的后果就是 ‘选出全部数据 or 更新全部数据 or 删除全部数据’ 相当于没有写条件,出现后是相当严重的问题。   2:like 配合 通配符:%和_ 的使用   通配符的分类: %百分号通配符: 表示任何字符出现任意次数**(可以是0次)**. _下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.   like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较. 注意: 如果在使用like操作符时,后面的没有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';只能匹配的结果为1000,而不能匹配像JetPack 1000这样的结果.   1)%通配符使用: 匹配以"yves"开头的记录:(包括记录"yves") SELECT * FROM products WHERE products.prod_name like 'yves%';   匹配包含"yves"的记录(包括记录"yves") SELECT * FROM products WHERE products.prod_name like '%yves%';   匹配以"yves"结尾的记录(包括记录"yves",不包括记录"yves ",也就是yves后面有空格的记录,这里需要注意) SELECT * FROM products WHERE products.prod_name like '%yves';   2)_通配符使用: SELECT * FROM products WHERE products.prod_name like '_yves'; 匹配结果为: 像"yyves"这样记录.   SELECT * FROM products WHERE products.prod_name like 'yves__'; 匹配结果为: 像"yvesHe"这样的记录.(一个下划线只能匹配一个字符,不能多也不能少)

标签:name,千万级,查询,索引,num,MySQL,where,like
From: https://www.cnblogs.com/leon1128/p/17822763.html

相关文章

  • mybatis使用id集合查询数据
    dao层intdelUser(@Param("menuId")IntegermenuId,@Param("idList")List<String>idList);xml层<deleteid="delUser">deleteFROMuser_role_menuWHEREmenu_id=#{menuId}ANDuser_idNOTIN<f......
  • MySQL学习(14)redo日志
    前言InnoDB存储引擎以页为单位从磁盘中加载到内存中,进行数据的管理。我们进行增删改查操作本质上是访问页面,其中包括读页面、写页面、创建新页面等操作。在访问页面之前,需要将页从磁盘中加载到BufferPool中才可以访问。在BufferPool中修改了数据后,会加入到flush链表中,但是flush......
  • mysql字符串拼接的4种方式总结
    前言第一种:第二种:第三种:第四种(运算,只对数字有效):附:MySQLgroup_concat()详解总结 前言总是记不住字符串拼接,每次都要百度去搜索,所以在这里记录一下,好方便后续的查找,如有错误和问题可以提出,谢谢。字符串拼接分为几种方式,在这里会一一举例写出:第一种:mysql自带语法C......
  • Docker安装并使用Mysql(可用详细)
    Docker安装并使用Mysql目录  一、Docker安装Mysql    1、启动Docker    2、查询mysql    3、安装mysql      1.默认拉取最新版本mysql      2.拉取指定版本mysql_5.7    4、查看镜像    5、本地创建挂载目录-......
  • win版本 mysql5.7 解压安装流程
    win版本mysql5.7解压安装流程https://dev.mysql.com/downloads/mysql/5.7.html#downloads1、添加系统变量变量名:MYSQL_HOME变量值:D:\ProgramData\mysql-5.7.44-winx642、编辑my.inimy.ini[mysqld]basedir=D:\ProgramData\mysql-5.7.44-winx64datadir=D:\ProgramData\mysql-5.7.......
  • C#winform学习3(C#连接MySQL数据库)
    需要引用MySQL.data.dll文件1.右键引用,如果没有MySQL.data.dll文件则选择浏览一般这个文件会存放在C:\ProgramFiles(x86)\MySQL\ConnectorNET8.0\Assemblies如果没有,需要去官网自己下载即可,参考:visualstudio2019使用MySQL.data的引用-知乎(zhihu.com)官网下载地址:MySQ......
  • MySql工具类
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Data;usingSystem.Collections;usingMySql.Data.MySqlClient;namespaceskylark.SqlTool{publicclassMySqlDBHelper{publicstaticstring......
  • 数据库数据恢复—MySQL数据库(无备份,未开启binlog)误删除表数据怎么恢复数据?
    数据库数据恢复环境:一台本地windowssever操作系统服务器,服务器上部署mysql数据库单实例,引擎类型为innodb,表内数据存储所使用表空间类型为独立表空间。无数据库备份,未开启binlog。数据库故障&分析:工作人员在执行Delete命令删除数据时未添加where子句进行筛选,导致全表数据被删除,......
  • 通过 MySQL Shell 8.2.0 工具进行数据复制/迁移
    一、通过sysbench创造测试数据1、创造测试数据[root@hankyoondb_tools]#sysbench--mysql-user=root--mysql-password='xxxxxx'--mysql-socket=/data/mysql/3307/mysql.sock/usr/share/sysbench/oltp_common.lua--tables=10--table_size=1000000preparesysbench1.0.1......
  • Java数据类型和MySql数据类型对应表
    javamysql数据类型对照类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述      VARCHARL+NVARCHARjava.lang.String12 CHARNCHARjava.lang.String1 BLOBL+NBLOBjava.lang.byte[]-4 TEXT65535VARCHARjava.lang.String-1       INTEGER4IN......