mysql创建索引 MySQL索引优化分析( 四 )


3创建高质量的索引很难:索引的创建不是一天完成的,也不总是相同的。需要根据用户的行为和具体的业务逻辑频繁地创建最佳索引。
指数分类
我们常说的索引,一般是指由BTree (Multi-way Search Tree)结构组织的索引。还有聚合索引、二级索引、复合索引、前缀索引、唯一索引,统称为索引,当然除了B+树,还有哈希索引等。
单值索引:一个索引只包含一列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许空值
复合索引:一个索引包含多个列,在实际开发中推荐使用
实际开发中建议使用复合索引,单个表创建的索引数量建议不超过五个
基本语法:
创建:
创建[唯一]索引索引名称包含名称(列名...)
在(列名)上添加[唯一]索引[索引名]...)
删除:
drop index[index name]ontableName
视图:
showindexfromtableName
哪些情况需要编制索引:
1个主键,唯一索引
2经常用作查询条件的字段需要建立索引
3经常需要排序、分组和统计的字段需要被索引
4查询与其他表相关联的字段,并建立具有外键关系的索引
在什么情况下不建立索引:
1表中的记录太少,没有必要为百万级以下的数据创建索引
2经常添加、删除和更改的表不需要创建索引
3不需要为重复数据和均匀分布的字段创建索引,如true和false。
4经常更新的字段不适合索引
5不用于WHERE条件的字段不需要编制索引
技术性能分析
MySQL瓶颈本身
MySQL自身的性能问题包括磁盘空不足,磁盘I/O过大,服务器硬件性能低下。
1 CPU:当CPU饱和时,通常发生在数据加载到内存或从磁盘读取时
2 IO:当加载的数据远远大于内存容量时,就会出现磁盘输入/输出瓶颈
3服务器硬件的性能瓶颈:top、free、iostat和vmstat查看系统的性能状态
解释解析sql语句
使用解释关键字模拟优化器执行sql查询语句,从而知道Mysql是如何处理sql语句的。
+ - + - + - + - + - + - + - + - + - + - + - + - +
| id | select _ type | table | partitions | type |可能的_ key | key | key _ len | ref | row | filtered | Extra
+ - + - + - + - + - + - + - + - + - + - + - + - +
自我
选择查询的序列号,包括一组可重复的数字,指示查询中执行sql语句的顺序。一般有三种情况:
第一种:id都一样,sql的执行顺序是从上到下;
第二种:id都不一样,sql的执行顺序以id的优先级为准;
第三种类型:id既有相同的,也有不同的。先按照较大的id执行,再按照相同的id从上到下执行。
选择类型
选择查询的类型主要用于区分普通查询、联合查询和嵌套复杂查询
简单:不包含子查询或联合的简单选择查询
主查询:如果查询包含任何复杂的子查询,最外层的查询将被标记为主查询
子查询:子查询包含在“选择”或“在哪里”列表中
派生的:包含在from列表中的子查询被标记为派生的。MySQL将递归执行这些子查询,并将结果放入临时表中。
联合:如果第二个选择出现在联合之后,它将被标记为联合。如果from子句的子查询中包含union,则外部选择将被标记为派生的
联合结果:选择从联合表中获取结果
划分
对于表中使用的分区,如果要统计十年的公司订单量,可以将数据分为十个分区,每一年代表一个分区。这样可以大大提高查询效率。
类型
这是一个非常重要的参数,连接类型,常见的有:all,index,range,ref,eqref,const,system,null。
性能从最好到最差的排名:system >:const >;eqref &gt。ref &gt。范围&gt。index &gt。对于java程序员来说,如果他们能确保查询至少达到范围级别,或者最好达到ref级别,那么All就是一个优秀且负责任的程序员。

推荐阅读