mysql单表查询语句优化

Mysql语句优化

范例1:优化语句SELECT * FROM `tbl_order_buy_eta` WHERE `id_order`=1843

#通过explain分析语句结果如下
mysql> explain SELECT * FROM `tbl_order_buy_eta` WHERE `id_order`=1843\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tbl_order_buy_eta
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1592
        Extra: Using where
1 row in set (0.00 sec)

#从上面我们能看出该语句没有使用任何索引,查询到结果扫描了1592行。
#查看表索引
mysql> show index from tbl_order_buy_eta\G
*************************** 1. row ***************************
        Table: tbl_order_buy_eta
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 1592
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)
#结果显示该表没有任何索引的存在

#我们在id_order列上创建索引
mysql> create index index_id_order on tbl_order_buy_eta(id_order);
Query OK, 0 rows affected (0.29 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from tbl_order_buy_eta\G
*************************** 1. row ***************************
        Table: tbl_order_buy_eta
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 1592
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: tbl_order_buy_eta
   Non_unique: 1
     Key_name: index_id_order
 Seq_in_index: 1
  Column_name: id_order
    Collation: A
  Cardinality: 1592
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)     #这一行是我们刚创建的索引

#再重新执行该查询语句,看看查询结果
mysql> explain SELECT * FROM `tbl_order_buy_eta` WHERE `id_order`=1843\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tbl_order_buy_eta
         type: ref
possible_keys: index_id_order
          key: index_id_order
      key_len: 4
          ref: const
         rows: 1
        Extra: NULL
1 row in set (0.03 sec)
#添加索引后查询语句走的索引,扫描了1行就得到结果了

范例2:优化语句SELECT * FROM `tbl_order_buy` WHERE (`id_order`=1989) AND (`pay_status`=0) AND (`finish_status`=0);

#通过explain分析语句
mysql> explain SELECT * FROM `tbl_order_buy` WHERE (`id_order`=1989) AND (`pay_status`=0) AND (`finish_status`=0);
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | tbl_order_buy | ALL  | NULL          | NULL | NULL    | NULL | 1592 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

#该表中没有任何索引,查询语句走的是全表扫,一共扫描1592行

#创建索引
mysql> create index tbl_id_pay_finish on tbl_order_buy(id_order,pay_status,finish_status);
Query OK, 0 rows affected (0.59 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from tbl_order_buy;
+---------------+------------+-------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name          | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+-------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tbl_order_buy |          0 | PRIMARY           |            1 | id            | A         |        1592 |     NULL | NULL   |      | BTREE      |         |               |
| tbl_order_buy |          1 | tbl_id_pay_finish |            1 | id_order      | A         |        1592 |     NULL | NULL   |      | BTREE      |         |               |
| tbl_order_buy |          1 | tbl_id_pay_finish |            2 | pay_status    | A         |        1592 |     NULL | NULL   | YES  | BTREE      |         |               |
| tbl_order_buy |          1 | tbl_id_pay_finish |            3 | finish_status | A         |        1592 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------------+------------+-------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

#再次分析sql语句
mysql> explain SELECT * FROM `tbl_order_buy` WHERE (`id_order`=1989) AND (`pay_status`=0) AND (`finish_status`=0);
+----+-------------+---------------+------+-------------------+-------------------+---------+-------------------+------+-------+
| id | select_type | table         | type | possible_keys     | key               | key_len | ref               | rows | Extra |
+----+-------------+---------------+------+-------------------+-------------------+---------+-------------------+------+-------+
|  1 | SIMPLE      | tbl_order_buy | ref  | tbl_id_pay_finish | tbl_id_pay_finish | 14      | const,const,const |    1 | NULL  |
+----+-------------+---------------+------+-------------------+-------------------+---------+-------------------+------+-------+
1 row in set (0.06 sec)
#可以看到只扫描了1行就得到结果了

范例3:优化语句SELECT * FROM `tbl_order_vendor_item_variation` WHERE `id_order`=1989;

#使用explain分析语句
mysql> explain SELECT * FROM `tbl_order_vendor_item_variation` WHERE `id_order`=1989;
+----+-------------+---------------------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table                           | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------------------------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | tbl_order_vendor_item_variation | ALL  | NULL          | NULL | NULL    | NULL | 2581 | Using where |
+----+-------------+---------------------------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
#结果显示没有索引,走的是全表扫,一共扫描2581行

#创建索引
mysql> create index tbl_order_vendor_item_variation_id_order on tbl_order_vendor_item_variation(id_order);
Query OK, 0 rows affected (0.36 sec)
Records: 0  Duplicates: 0  Warnings: 0

#重新分析sql语句
mysql> explain SELECT * FROM `tbl_order_vendor_item_variation` WHERE `id_order`=1989\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tbl_order_vendor_item_variation
         type: ref
possible_keys: tbl_order_vendor_item_variation_id_order
          key: tbl_order_vendor_item_variation_id_order
      key_len: 5
          ref: const
         rows: 1
        Extra: NULL
1 row in set (0.00 sec)
#sql语句走的是刚创建的索引,共扫描1行
时间: 2024-10-31 06:09:08

mysql单表查询语句优化的相关文章

mysql 单表查询

目录 单表查询 准备数据 简单查询 比较运算符 范围筛选 between 多选 in 模糊查询 like 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not 身份运算 - 关于null is null /is not null 正则匹配 regexp 分组 group by 聚合 (把很多行的同一个字段进行一些统计,最终的到一个结果) 分组+聚合 HAVING过滤 单表查询 准备数据 只是把查询结果按照自己想要的方式返回,不对数据做修改 #准备表和记录 company.emplo

133 MySQL单表查询

目录 一.单表查询 1.1 语法 1.2 关键字优先级 1.3 注意(重点) 1.4 测试一个单表的distinct去重 二.表记录查询测试 2.1常用函数 2.2 数据准备 2.3 表记录测试 2.3.1 where条件查询 2.3.2 group by 分组查询 2.3.3 having 和 where 2.3.4 排序 order by 2.3.5 limit限制 一.单表查询 1.1 语法 每次查询出来的一些记录,他们都是一张表,只不过这张表是存在内存中的 查询记录如果想要二次利用的话,

python开发mysql:单表查询&多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

0x06 MySQL 单表查询

一 单表查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键字执行优先级(重点) 重点中的重点:关键字的执行优先级 1)from 2)where 3)group by 4)having 5)select 6)distinct 7)order by 8)limit 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一

python之路--MySQl单表查询

一 单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据. SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中

一个MySQL 单表查询SQL,引起一次“故事”

一.描述故事的过程是这个样子的,MySQL 数据库有一张40多G的大表,开发人员执行了一个单表查询,结果我就收到了一个磁盘空间满的告警.一下子就不淡定了,谁在搞事情,脑海里各种可能行想了一遍,想到的最多的就是ibtmp1爆了,第一时间线上看一下,查到了最大的那个文件,结果和想的一样.这里我们要看SQL是怎么写的,表结构是什么样子,然后和官网对比,MySQL在查询的时候有很多可能会使用磁盘临时表,包括表连接.排序.大字段等等. 二.解决方法临时解决方法:1.临时扩一下硬盘2.直接重启 终结解决方案

mysql单表查询&&多表查询(职员表14+9)

dept(deptno,dname,loc) emp(empno,ename,job,mgr,hiredate,sal,COMM,deptno) salgrade(grade,losal,hisal) stu(sid,sname,age,gander,province,tuition) 单表查询题目 ==================================================== dept(deptno,dname,loc) emp(empno,ename,job,mgr

Oracle的单表查询语句

使用Oracle 数据库的测试表单: --单表查询数据 语法 select (查询) * 所有 /查询的字段,多个字段 ,隔开 from (来自) 表名称 --查询所有员工的信息 select * from scott.emp; select * from dept; --查询所有员工的编号,姓名和职位 指定字段名查找数据 select empno,ename,job from emp; --查询所有员工的编号,姓名和年薪 select * from emp; select empno,enam

mySQL 多表查询语句

多表查询最少有2张以上的表一起查询 交叉连接查询(很少用)查询出来的数据是错误的 内连接 [inner] join on 隐式省略inner join on select  from 表A,表B where 表A.主键 = 表B.外键 显示写出inner join on select  from 表A inner join 表B on 表A.主键 = 表B.外键 外连接 左外连接(以左边的表为主)left [outer] join on select  from 表A left [outer]