mysql创建索引 MySQL索引优化分析

为什么您的sql查询很慢?为什么您的索引经常失败?通过本章,您将了解MySQL性能下降的原因、索引的介绍、索引创建的原理、解释命令的使用以及解释输出字段的含义。帮助您理解索引、分析索引、使用索引以及编写性能更高的sql语句。你还在等什么?卷起袖子就干了!
个案分析
让我们简单了解一下非关系数据库和关系数据库的区别。
蒙古银行是NoSQL银行之一。NoSQL的全名不仅是SQL,它是一个非关系数据库。它的特点是高性能、可扩展性强、模式灵活,尤其是在高并发场景下。但目前只是对关系数据库的补充,在数据一致性、数据安全性、查询复杂度等方面与关系数据库还有一定差距。
MySQL是一种查询功能强、数据一致性高、数据安全性高的关系数据库,支持二级索引。但是性能不如MongoDB,尤其是对于百万级以上的数据,容易出现查询速度慢的问题。这时候就要分析查询慢的原因了,一般是程序员sql写的不好,没有键索引,或者索引无效。
公司的ERP系统数据库主要是MongoDB (NoSQL最接近关系数据),其次是Redis,MySQL只占一小部分。现在MySQL又被使用了,感谢阿里巴巴的祁门系统和巨石塔系统。考虑到订单数在一百万以上,分析MySQL的性能就显得尤为重要。
先说两个简单的例子。后面会详细介绍各个参数的作用和意义。
场景1:订单导入,避免通过交易号重复导入订单
业务逻辑:导入订单时,为了避免重复的订单介绍,通常会在数据库中通过交易号进行查询,以确定订单是否已经存在。
最基本的sql语句
mysql&gt。从itdragon_order_list中选择* transaction _ id = " 81X 97310v 32236260 E ";
+ - + - + - + - + - + - + - + - + - + - + - + - +
| id | transaction _ id | gross | net | stock _ id | order _ status | de | finance _ de | create _ type | order _ level | input _ user | input _ date |
+ - + - + - + - + - + - + - + - + - + - + - + - +
| 10000 | 81X 97310v 32236260 E | 6.6 | 6.13 | 1 | 10 | ok | ok | auto | 1 | it dragon | 2017-08-18 17:01:49
+ - + - + - + - + - + - + - + - + - + - + - + - +
mysql&gt。解释从itdragon_order_list中选择*其中transaction _ id = " 81X 97310v 32236260 E ";
+ - + - + - + - + - + - + - + - + - + - + - + - +
| id | select _ type | table | partitions | type |可能的_ key | key | key _ len | ref | row | filtered | Extra
+ - + - + - + - + - + - + - + - + - + - + - + - +
|1|简单| itdragon _ order _ list | NULL | ALL | NULL | NULL | NULL | 3 | 33.33 |使用where |
+ - + - + - + - + - + - + - + - + - + - + - + - +
查询本身没有问题,在线测试环境也没有问题。但是一旦功能上线,查询速度慢的问题就要面对面了。上亿订单,满桌扫描?嗯?哼!
您如何知道sql是全表扫描?解释命令让你知道Mysql是如何处理sql语句的。打印内容分别表明:
Id:查询序列号为1。
Selecttype:查询类型是简单查询,简单select语句没有联合或子查询。
表:表是itdragonorderlist。
分区:没有分区。
类型:连接类型,都是指全表扫描。
可能的关键字:可能使用的索引为空。
键:实际索引为空。
凯伦:索引长度当然是空的。
引用:没有列或参数与键一起使用。
额外:使用查询的地方。
因为数据库中只有三条数据,所以行和筛选的信息影响不大。这里需要强调的是,全表扫描在类型为ALL时性能最差。假设数据库中有上百万的数据,没有索引的帮助会异常卡顿。
初步优化:为transactionid创建一个索引
mysql&gt。在itdragon _ order _ list(transaction _ id)上创建唯一索引idx _ order _ transaID
mysql&gt。解释从itdragon_order_list中选择*其中transaction _ id = " 81X 97310v 32236260 E ";

推荐阅读