问题一:遇到一个问题,mysql库下表A有几万条数据;表B也有几万条数据,结果两表关联的时候,查询超级慢,30s内没反应。

问题一解决方案:

1. 加索引,但索引不要乱加,两表关联,必须要创建的索引是两表的管理字段 e.g

select * from A t1 left join B t2  on t1.did= t2.did and t1.uid = t2.uid

这种情况下,一定要给A表的uid和did创建索引,如果uid值是唯一那就创建唯一所引UNIQUE;否则就创建normal索引。

基本上加索引之后,查询速度立马就秒级了。

有索引就像新华字典的目录一样按照a,b,c顺序排好序,查找时速率才会高。

问题二:查询语句,主表换了之后,也加了关联字段的索引,结果还是很慢,就很奇怪,只是主表换了而已

问题二解决方案:原来是两张表的字符集不一样,B表utf8(3个字节)和表A utf8mb4(4个字节)字符集兼容问题。

select * from A left join B where A.id = B.id   A作为主表字符集包含B,可以很快查询导数据

select * from B left join A  where A.id = B.id   B作为主表则无法快速查询到数据,因为B无法兼容4个字符的数据,只能全表扫描

索引和主键的区别

索引分为:主键索引(SPATAIL)、唯一索引(UNIQUE)、常规索引(NORMAL)和全文索引(FULLTEXT);

创建索引一般为

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的

1.唯一性索引列允许空值,而主键列不允许为空值

2.主键列在创建时,已经默认为非空值 + 唯一索引了,在navicat中可能看不到,可以使用mysql查询语句来查看#show index from 表名;

3.主键可以被其他表引用为外键,而唯一索引不能

4. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等

组合索引创建

当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

减少开销:创建A B C 组合索引,相当于创建了(A)(A,B)(A,B,C)3个索引。 (a,b,c)多列索引和 (a,c,b)是不一样的

覆盖索引:查询 select A,B,C from 表名 ,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询。

组合索引的生效原则从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;

where a=1 and b=2 and c=3 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关 

索引基本创建注意事项

1. 索引不是越多越好,根据需要创建;对于重复数据的字段,没必要创建索引

2.涉及到关联表的一定要创建关联字段的索引

3. 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引

4.使用短索引。对字符列进行索引,尽可能指定长度。短索引,不仅可以提高查询速度而且能节省磁盘空间

索引不生效的情况

1. 在索引字段上运算  where id-1=1 或者WHERE column(column)> 10;

2. 隐性转换。字符和数值型

3.like “%aaa%”  "%aaa"不会使用索引而like “aaa%”可以使用索引

4.如果多个OR条件中有其中一个条件没有索引,则必须进行全表索引

什么情况下适合建立索引?

一般来说,在WHERE和JOIN中出现的列需要建立索引。因为MySQL只对,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。

索引缺点

1..虽然索引大大提高了查询速度,同时会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存索引文件。
2.建立索引会占用磁盘空间的索引文件。如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

查看无效索引,清除无效索引?

查看索引是否生效:https://blog.csdn.net/u014470581/article/details/68065590

参考链接:https://www.cnblogs.com/yszr/p/10674729.html

mysql多数据表关联查询慢问题解决方案相关推荐

  1. ORACLE数据库多表关联查询效率问题解决方案

    ORACLE数据库多表关联查询效率问题解决方案 参考文章: (1)ORACLE数据库多表关联查询效率问题解决方案 (2)https://www.cnblogs.com/baib/p/5086777.h ...

  2. MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?

    这里写目录标题 MySQL多表关联查询对比多次单表查询,哪个效率高? 疑问: 高手解答: <阿里巴巴JAVA开发手册>里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? ...

  3. Mysql多表关联查询

    ​​​​​三表(replay_case.replay_task及general_flow)联合查询,注意select时,如果某个字段在不同的表中有重复的话需要指定具体的表,比如应该使用:select ...

  4. 2022/1/22 北京 mysql 多表关联查询,等值连接、非等值连接,外连接,内连接、自连接

    一.笛卡尔积错误 要查询的俩个字段分别在俩张表 employee_id,department_name.所以要多表关联查询 select * from employees; -- 能查询出107条记录 ...

  5. MYSQL多表关联查询与子查询

    多表关联查询 关联查询又名连接查询,其主要包括了内连接,外连接,自连接,交叉连接等四个大类. 首先我们要清楚我们为什么要使用多表关联查询,肯定是因为我们想要显示的数据来自于两个或多个数据表内部,我们想 ...

  6. MySQL多表关联查询与存储过程

    --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...

  7. mysql 子表 关联查询语句_MySQL-基本查询语句及方法,连表和子查询

    一.基本查询语句 create table emp( id intnotnull unique auto_increment, name varchar(20) notnull, sex enum(' ...

  8. mysql 子表 关联查询语句_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 基本语法:SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * FR ...

  9. mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...

最新文章

  1. 详解这场图片分类赛baseline,赢取官方人才认证+奖金
  2. 微信小程序 wxml 中使用 js函数
  3. 先验概率,后验概率,最大似然估计,最大后验概率
  4. 如何删除 AWS 资源以及关闭账户(来自亚马逊官方提供文档,记录一下方便查看)
  5. TypeScript 参数属性
  6. RxSwift之UI控件UITextField与UITextView扩展的使用
  7. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML
  8. 反爬终极方案总结---字体反爬
  9. go将服务器图片响应给客户端,Go中来自客户端和服务器的RPC
  10. Codeforces Global Round 10
  11. vivo NEX 3S 5G今日登场:无界瀑布屏加持 世界随处可及
  12. 【Python3练习题 019】 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。...
  13. java 基本数据类型及自动类型转换
  14. cocos2d-x Schedule详解
  15. avs3 ts格式封装 标准_Go time.RFC3339 时间格式化
  16. Tomcat 设置系统默认文件编码
  17. xshell 官网下载
  18. Flash Builder4安装SVN插件
  19. matlab中变量的命名规则
  20. Windows中Redis的下载安装与修改密码并启动

热门文章

  1. 「微信群合影2.3.0」- 新增高清头像
  2. 2020计算机二级报名时间表下半年山东,2020年3月山东省计算机二级报名时间|网上报名入口【12月20日9:00开通】...
  3. 吉尔布雷斯的动作研究——《可以量化…
  4. 看看你的老祖宗是谁,姓氏血统图及各姓图腾
  5. 微信中域名网站域名被封锁、被屏蔽、被和谐后的解决方法
  6. Python Scrapy 上传图片到FastDfs(py3fdfs)
  7. Ubuntu20.04 添加右键新建文件
  8. item_search - 根据关键词获取义乌购商品列表
  9. 安装VS2010的SP1补丁的办法
  10. mac怎么强制退出程序,强制退出Mac程序,mac 强制退出程序