首页 > 数据库 >mysql索引优化-收藏

mysql索引优化-收藏

时间:2023-06-19 15:24:13浏览次数:45  
标签:phone mysql 收藏 索引 match 0797 where select user

原文章:https://www.cnblogs.com/eryuan/p/17488732.html

https://www.cnblogs.com/eryuan/p/17430377.html

 

in/or到底能不能用索引

参数range_optimizer_max_mem_size

要控制范围优化器可用的内存,使用range_optimizer_max_mem_size系统变量:

  • 值为0表示“没有限制”。

  • 当值大于0时,优化器将跟踪在考虑范围访问方法时所消耗的内存。如果即将超过指定的限制,则放弃范围访问方法,转而考虑其他方法,包括全表扫描。这可能不太理想。如果发生这种情况,会出现以下警告(其中N是当前的range_optimizer_max_mem_size值)。

in两种情况会走全表扫描:

  • in后面条件导致sql大小超过range_optimizer_max_mem_size。
  • in后面条件个数接近或者等于表数量,执行引擎认为此时全表扫描更加合适。

推而广之,or也是一样的道理。其它> >= < <= BETWEEN AND应该也是同样的道理。归根结底都是范围查询。

 

统计排序

一旦 where having order by 里的字段是通过max,min,count等计算出来的虚拟字段,那么肯定会产生 Using temporary; Using filesort 临时表和IO文件排序。

解决办法:适当的建立冗余字段,或者宽表。

 

深度分页

select * from a_table order by num limit 700000,15

通过执行计划,可以明显的看出,mysql会将前 700015条数据取出来,然后丢掉前700000条,只取后15条数据。前面读取的700000条数据是不必要耗时操作。

解决深度分页的方式:

1 利用覆盖索引延迟关联: select p.name from a_table p inner join (select id from a_table order by num limit 700000,15) p2 on p.id=p2.id;先通过覆盖索引把id拿到,再把这15条数据去关联一次拿到其它字段

2 记录上次的位置

3 通过子查询

 

全文索引

全匹配-使用布尔模式的逻辑运算符

布尔模式的逻辑运算符:

1  select * from t_user where match(phone) AGAINST('0797 +12345' in boolean mode)  表示同时包含079712345

2  select * from t_user where match(phone) AGAINST('0797 -12345' in boolean mode)  表示0797必须包含,但不包含12345

3  select * from t_user where match(phone) AGAINST('0797(>94649 <12345)' in boolean mode)  表示匹配0797,同时包含94649的列往前排,包含12345的往后排 ,> 提高/降低该条匹配数据的权重值  () 表达式分组

4  select * from t_user where match(phone) AGAINST('"0797-1789"' in boolean mode)  完全匹配,被双引号包起来的单词必须整个被匹配。

5  select * from t_user where match(phone) AGAINST('"0797-1789" "0797-1234"' in boolean mode)  空格表示 or

 

标签:phone,mysql,收藏,索引,match,0797,where,select,user
From: https://www.cnblogs.com/caroline2016/p/17491238.html

相关文章

  • mysql 可以重复执行的表结构修改存储过程
    mysql可以重复执行的表结构修改存储过程当多个数据库要执行同一个sql,但是在其中有一个数据库失败需要重新执行,那么就要保证执行的数据库是可以重复执行的了,下面就是可以重复执行的存储过程,收藏起来DELIMITER;;CREATEPROCEDURE`AddColumnIfNotExists`( tableNameVARCHAR......
  • MySQL表类型和存储引擎
    基本介绍MySQL的表类型由存储引擎决定,主要包括MyISAM、innoDB、Memory等MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB这六种又分为两类,一类是“事务安全型”,比如:InnoDB;其余都属于第二类,称为“非事务安全型”细节说明MyISAM不支持事务、也不......
  • MySQL时间函数的选择
    Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。在MySQL中,获得系统当前时间可以使用now()函数,这是最简单和应用最广的函数。除此之外,curre......
  • 外键要建立索引的原理和实验
    项目中,我们要求凡是有主子关系的表都要使用外键约束,来保证主子表之间关系的正确,不推荐由应用自己控制这种关系。但发现有时开发人员提交SQL语句时未必会注意外键列需要定义索引,或者不清楚为什么外键列需要建立索引,网上一些所谓的“宝典”也会将外键列建索引作为其中的一条,包括TOM大......
  • 收藏向 | 车载Android系统开发学习专题,进军车载必备
    如今,智能手机已无处不在,移动操作系统开始向新的领域扩张,这其中,就有近段时间被苹果CarPlay催热的车载系统。目前全球的汽车数量已经超过10亿辆,但车载系统却仍然有非常大的提升空间。汽车厂商们也早已意识到了车载对于未来汽车市场的重要性,开始布局更加智能的车载系统,让自己的汽车能......
  • 初探MySQL-小白的Linux安装笔记
    这篇文章是我们组内一位小伙伴垒的文字,亲测每个步骤,真实、可靠、接地气,照着做就能入门Linux下的MySQL安装,欢迎更多的小伙伴能将日常工作中的经验记录下来,分享给其他人,正所谓“独乐乐不如众乐乐”。最近接到一个任务,由于开发环境变化,需要将旧机器上的mysql迁移到新机器上去,其中涉及......
  • 通过索引提升SQL性能案例一则
    最近有个应用,前端调用后台的一个逻辑很慢,请开发提供了对应逻辑使用的SQL,进行脱敏,示例如下,selectt.AGENTasagent,nvl(sum(casewhent.operation_type='A'then1else0end),0)asDflCount,nvl(sum(casewhent.operation_type=......
  • 小白学习MySQL - 闲聊聊
    众所周知,在DB-Engines的排行榜,一直占据前两位的数据库,就是Oracle和MySQL,Oracle作为关系型数据库的老大,在这个生态圈中,占据着绝对优势,MySQL作为一款面向“开源"的软件,虽然被Oracle曲线收购,相比之下,还是存在着“开源”的血统,而且有很多分支,无论是国外的MariaDB,还是国内的AliSQL,都在发......
  • 小白学习MySQL - MySQL会不会受到“高水位”的影响?
    前两天碰到了一个问题,MySQL的一张表,1220万数据量,需要删除1200万数据,仅存储20万数据,讨论了三种方案,1.00:00直接执行truncate,只存储新数据。2.将1220万中的20万采用CTAS存到一张中间表,再通过rename改这两张表的名称,实现替换操作。3.delete删除1200万数据。经过综合考虑,用的方案3,方......
  • php解决 mysql_connect(): The mysql extension is deprecated and will be removed i
    Themysqlextensionisdeprecatedandwillberemovedinthefuture:usemysq翻译:mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。解决方法:打开php.ini配置文件把display_errors=On改为display_errors=Off改完之后重启服务就可以了。  ......