MySQL查询优化程序

转载 2006年06月04日 17:49:00

1.EXPLAIN SELECT * FROM tb1_name WHERE 1= 0可以查看到执行的信息

1 比较具有相同类型的列。在比较中利用索引列时,应该使用那些类型相同的列。例如,CHAR(10) 被视为与CHAR(10) 或VARCHAR(10) 相同,但不同于CHAR(12) 和VARCHAR( 12 )。INT 与BIGINT 不同。在MySQL3.23 版以前,要求使用相同类型的列,否则列上的索引将不起作用。自3.23 版后,不严格要求这样做,但相同的列类型比不同类型提供更好的性能。如果所比较的两列类型不同,可使用ALTER TABLE语句修改其中之一使它们的类型相配。

2  比较中应尽量使索引列独立。如果在函数调用或算术表达式中使用一个列,则MySQL不能使用这样的索引,因为它必须对每行计算表达式的值。有时,这是不可避免的,但很多时候,可以重新编写只取索引列本身的查询。下面的WHERE 子句说明了怎样进行这项工作。第一行中,优化程序将简化表达式4/2 为值2,然后使用my_col 上的索引快速地找到小于2 的值。而在第二个表达式中,MySQL必须检索出每行的my_col 值,乘以2,然后将结果与4 比较。没索引可用,因为列中的每个值都要检索,以便能对左边的表达式求值:

  WHERE my_col < 4/2

  WHERE my_col * 2 < 4

  让我们考虑另一个例子。假如有一个索引列date _ c o l。如果发布如下的查询,相应的索引未被使用:

  SELECT * FROM my_tb1WHERE YEAR(date_col) < 1990

其中表达式并不将索引列与1990 比较,而是将从列值计算出的值用于比较,而且必须计算每行的这个值。结果是, date_col 上的索引不可能得到使用。怎样解决?使用一个文字日期即可,这时将会使用date_col 上的索引:

  WHERE date_col < "1990-01-01"

但是假如没有特定的日期值,那么可能会对找到具有出现在距今一定天数内的日期的记录感兴趣。有几种方法来编写这样的查询,但并非所有方法都很好。三种可能的方法如下:



其中第一行不能利用索引, 因为必须为每行检索列, 以便能够计算TO _ DAYS(date_col) 的值。第二行要好一些。c ut o ff 和TO _ DAY S ( CURRENT _ DATE) 两者都是常量,因此比较表达式的右边可在查询处理前由优化程序一次计算出来,而不是每行计算一次。但date_col 列仍然出现在一个函数调用中,因此,没有使用索引。第三行是最好的方法。比较表达式的右边可在执行查询前作为常量一次计算出来,但现在其值是一个日期。这个值可直接与date_col 的值进行比较,不再需要转换为天数,可以利用索引。

■ 在LIKE 模式的起始处不要使用通配符。有时,有的人会用下列形式的WHERE 子句来搜索串:

  WHERE col_name LIKE "%string%"

如果希望找到s t r i n g,不管它出现在列中任何位置,那么这样做是对的。但不要出于习惯在串的两边加“ %”。如果实际要查找的只是出现在列的开始处的串,则不应该要第一个“%”号。例如,如果在一个包含姓的列中查找“ M a c”起始的姓,应该编写如下的WHERE 子句:

  WHERE last_name LIKE "Mac%"

优化程序考虑模式中的开始的文字部分,然后利用索引找到相符合的行。不过宁可写成如下的表达式,它允许使用last_name 上的索引:

  WHERE last_name >= "Mac" AND last_name < "Mad"

这种优化对使用REGEXP 操作符的模式匹配不起作用。

MySQL数据库优化(五)——MySQL查询优化

一、mysql查询类型(默认查询出所有数据列) 1、内连接       默认多表关联查询方式,查询出两个表中所有字段;可省略inner join 关键字 2、外连接 查询出某一张表中的所有数据 ...
  • Daybreak1209
  • Daybreak1209
  • 2016年06月11日 21:30
  • 2014

mysql联合查询分析及优化

最近在做报表,跟数据库打交道的比较多,所以特意来总结一下mysql的联合查询; 查询常用的字句     where(条件查询)、having(筛选)、group by(分组)、order by(排...
  • liaodehong
  • liaodehong
  • 2016年05月11日 11:36
  • 1679

Mysql查询优化器

Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率。那么到底mysq...
  • caomiao2006
  • caomiao2006
  • 2016年08月14日 15:31
  • 389

MySQL多表查询核心优化

在一般的项目开发中,对数据表的多表查询是必不可少的。而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始。...
  • u013761665
  • u013761665
  • 2016年03月22日 17:00
  • 5522

Mysql查询优化器浅析(上)

 Mysql查询优化器浅析(上)译者:杨万富 1 定义   Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新版本的查...
  • whyangwanfu
  • whyangwanfu
  • 2007年12月13日 11:58
  • 7924

mysql千万级大数据SQL查询优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎...
  • u014421556
  • u014421556
  • 2016年07月29日 13:27
  • 33888

mysql 大数据 查询优化原则

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数...
  • bigtree_3721
  • bigtree_3721
  • 2017年05月18日 16:37
  • 725

mysql中like模糊查询优化

这是我在一个百万级数据库遇到的问题 比如这个语句在这个数据库查询很慢:            select a from news where b like ‘%haha%’ order by t...
  • createment
  • createment
  • 2016年01月28日 18:36
  • 1694

MySQL查询优化器源码分析--整体流程

函数间关系的主要逻辑如下: handle_select(){――第(1)层   mysql_union(); //处理union操作   mysql_select(){――第(2)层 JOIN...
  • fly2nn
  • fly2nn
  • 2017年03月13日 18:54
  • 190

《MySql》--百万级数据优化查询

前言 众所周知,当一个数据库的单表数据量很大时,比如说是百万数量级的,如果我们使用普通的查询语句的话,耗时会非常多(相比加上索引),今天小编带领着大家做一下实验,见证一下具有二百多万条数据的单表,...
  • u013067402
  • u013067402
  • 2017年01月18日 07:42
  • 8267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL查询优化程序
举报原因:
原因补充:

(最多只允许输入30个字)