MySQL索引优化浅析

MySQL是关系型数据库的一种,查询功能强,数据一致性高,数据安全性高,支持二级索引.但是性能比起非关系型数据库稍弱,特别是百万级以上的数据,很容易出现查询慢的现象.这时候要分析慢的原因,一般情况下是程序员的SQL写的烂,或者是没有索引,或者是索引失效等原因导致的.

案例分析:

场景一:订单导入,通过交易号避免重复导单

业务逻辑:订单导入时,为了避免重复导单,一般会通过交易号去数据库中查询,判断该订单是否已经存在.

最基础的sql语句:

mysql> select * from itdragon_order_list where transaction_id = "81X97310V32236260E";
+-------+--------------------+-------+------+----------+--------------+----------+------------------+-------------+-------------+------------+---------------------+
| id    | transaction_id     | gross | net  | stock_id | order_status | descript | finance_descript | create_type | order_level | input_user | input_date          |
+-------+--------------------+-------+------+----------+--------------+----------+------------------+-------------+-------------+------------+---------------------+
| 10000 | 81X97310V32236260E |   6.6 | 6.13 |        1 |           10 | ok       | ok               | auto        |           1 | itdragon   | 2017-08-18 17:01:49 |
+-------+--------------------+-------+------+----------+--------------+----------+------------------+-------------+-------------+------------+---------------------+

mysql> explain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table               | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | itdragon_order_list | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+

 sql语句和查询都没有问题,但是功能一旦上线,查询慢的问题就迎面而来,几百万,几千万的订单,用全表扫描???那就完了....

怎么知道该sql语句是全表扫描?

通过desc命令和explain命令(功能是一样的)可以清楚MySQL是如何处理sql语句的,打印的内容分别是:

id : 查询序列号为1。
select_type : 查询类型是简单查询,简单的select语句没有union和子查询。
table : 表是 itdragon_order_list。
partitions : 没有分区。
type : 连接类型,all表示采用全表扫描的方式。
possible_keys : 可能用到索引为null。
key : 实际用到索引是null。
key_len : 索引长度当然也是null。
ref : 没有哪个列或者参数和key一起被使用。
Extra : 使用了where查询。
因为数据库中只有三条数据,所以rows和filtered的信息作用不大。这里需要重点了解的是type为ALL,全表扫描的性能是最差的,假设数据库中有几百万条数据,在没有索引的帮助下会异常卡顿。

猜你喜欢

转载自www.cnblogs.com/zhaijihai/p/10273620.html