mysql索引优化续

(1)索引类型:

  1. Btree索引:抽象的可以理解为“排好序的”快速查找结构
    myisam,innodb中默认使用Btree索引
  2. hash索引:hash索引计算速度非常的快,但数据是随机放置的,无法对范围进行优化,无法利用前缀索引,排序也无法优化
    memory表里默认使用hash索引

(二)单列索引与多列索引
一、单列索引
二、多列索引
    怎么才能够让多列索引充分发挥作用?
    1.在多列索引上,索引使用匹配需要符合左前缀规则

有如下联合索引:index(a,b,c)

select * from test_table where a=1 and b=2 and c=3;               从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引

select * from test_table where a=1 and c=3 and b=3;               mysql很聪明的,虽然查询的条件列不是按照顺序来的,但是mysql会自动识别的所以仍然都可以使用到索引

select * from test_table where a=1 and b=2 and c>3;               从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引

select * from test_table where a=1 and b>2 and c=3;               从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引,依然c列索引也会使用到,所以都使用到了索引

select * from test_table b=2 and c=3;                                         索引生效是从左到右的如果断掉了后面的索引列就不会生效了,这个没有用到a索引,所以 一个索引都没有使用到

select * from test_table  b=2;                                                       同上

select * from test_table  c=3;                                                        同上

分组统计建议要先按照分组的字段进行排序然后再统计

我们想知道某条sql语句是不是按照我们希望的方式使用了索引我们可以使用explain来查看sql语句的执行计划:
explain用法说明:

只需要在sql语句前面加上explain即可

mysql> explain select * from t where c1=‘a‘ and c5=‘e‘ order by c2,c3;

+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+

| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra                    |

+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+

|  1 | SIMPLE      | t     | ref  | c1            | c1   | 3       | const |    6 | Using where; Using index |

+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+

table:表示使用的数据表
type:连接类型有多个值,不同的值体现了sql语句不同的优化级别

keys:mysql使用的索引

key_len:mysql使用的索引长度

rows:mysql执行查询的行数,数值越大越不好说明没有用好索引

extra:mysql解决查询的详细详细有几个参数需要解释下
    using   filesort:说明使用执行该sql语句先使用了数据排序

using index:说明使用了索引

using temporary:说明mysql创建了临时表来容纳结果

(三)show profiles的使用

一般情况情况是这样的我们考虑需要建立给表建立索引是由于查询缓慢,这个时候我们可以通过开启show profiles来了解我们优化的进展,和方案的可行性。

show profiles:默认一般都是关闭的,但是会话级别可以开启这个功能,开启后可以让mysql收集在执行sql语句时的所有相关信息,通过这个可以比较明确的了解优化的成果。

1.查看show profile是否开启

mysql> show variables like "%pro%";

+---------------------------+-------+

| Variable_name             | Value |

+---------------------------+-------+

| have_profiling            | YES   |

| profiling                 | OFF   |

| profiling_history_size    | 15    |

| protocol_version          | 10    |

| proxy_user                |       |

| slave_compressed_protocol | OFF   |

| stored_program_cache      | 256   |

+---------------------------+-------+

2.如果profiling关闭了则开启选项
    mysql> set profiling=1;

3.查看sql语句运行的信息

在开启profile后系统中执行的sql语句都将被记录

mysql> show profiles;

+----------+-------------+--------------------------------------------------------------------------------------------------------+

| Query_ID | Duration    | Query                                                                                                  |

+----------+-------------+--------------------------------------------------------------------------------------------------------+

|        1 |  0.00031950 | show variables like "%pro%"                                                                            |

|        2 |  0.00020125 | show tables                                                                                            |

|        3 |  0.40749175 | select count(*) from b2b_my_test_value                                                                 |

|        4 |  0.00008600 | show processlist                                                                                       |

|        5 |  0.40956300 | select count(*) from b2b_my_test_value                                                                 |

|        6 |  0.00007225 | show profile for query                                                                                 |

|        7 |  0.00004150 | show profile for query                                                                                 |

|        8 | 23.30362350 | select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao`                             |

|        9 |  0.00018900 | show index from b2b_my_test_value                                                                      |

|       10 |  0.00015050 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao`                     |

|       11 |  0.00014875 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao`                     |

|       12 |  0.00016725 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` order by `my_aihao` |

|       13 |  0.00018725 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao`                     |

|       14 |  0.00020875 | show index from b2b_my_test_value                                                                      |

|       15 |  0.00008125 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value where   group by `my_aihao`             |

+----------+-------------+--------------------------------------------------------------------------------------------------------+

15 rows in set, 1 warning (0.00 sec)

这样我们就可以很方便的了解sql执行的时间了

时间: 2024-11-09 06:17:48

mysql索引优化续的相关文章

mysql索引优化

mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间,处理起来更快. >简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂.在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间:以及用整型数据类型存储IP地址. >尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL.在MySQL中,含有空

MySQL索引优化-from 高性能MYSQL

Btree: 1. 尽量使用覆盖索引, 即三星索引 2. 多列索引如果带范围的话, 后续列不会作为筛选条件 3. 多列索引应选择过滤性更好的充当前缀索引 4. 尽量按主键顺序插入, 减少页分裂, 采用自增ID在高并发情况下, 可能造成明显征用, 或者更改innodb_autoinc_lock_mode配置. Hash: 1.只有精确匹配所有列的查询才有效, 对于每行数据, 引擎都会对所有索引列计算hash码 2. 只有memory才可以支持hash索引, innodb支持自适应hash索引, 但

【转载】MySQL索引优化

MySQL索引优化 原文链接 MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构.索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样.如MYISAM和InnoDB存储引擎只支持BTree索引:MEMORY和HEAP储存引擎可以支持HASH和BTREE索引. 这里仅针对常用的InnoDB存储引擎所支持的BTree索引进行介绍: 一.索引类型 先创建一个新表,用于演示索引类型 CREATE TABLE index_table ( id BIGINT NOT NULL au

Mysql 索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句.还在等啥子?撸起袖子就是干! 案例分析 我们先简单了解一下非关系型数据库和关系型数据库的区别. MongoDB是NoSQL中的一种.NoSQL的全称是Not only SQL,非关系型数据库.它的特点是性能高,扩张性强,模式灵

mySql索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句.还在等啥子?撸起袖子就是干! 案例分析 我们先简单了解一下非关系型数据库和关系型数据库的区别.MongoDB是NoSQL中的一种.NoSQL的全称是Not only SQL,非关系型数据库.它的特点是性能高,扩张性强,模式灵活

MySQL索引优化步骤总结

在项目使用mysql过程中,随着系统的运行,发现一些慢查询,在这里总结一下mysql索引优化步骤 1.开发过程优化 开发过程中对业务表中查询sql分析sql执行计划(尤其是业务流水表),主要是查看sql执行计划,对sql进行优化. explain执行计划关键属性 select_type,possible_keys,key,rows (1) select_type 访问类型 system>const > eq_ref > ref > fulltext > ref_or_null

MySQL 索引优化原则

一.索引优化原则 1.最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整. 2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优

Mysql 索引优化

索引的存储分类MyISAM 存储引擎的表数据和索引是自动分开存储的,各自是独一的一个文件Innodb 存储引擎的表数据和索引是存储在同一个表空间里面,但可以由多个文件构成.Mysql 目前不支持函数索引,但是能对列的前面某一部分进行索引例如 name 字段,可以只取 name 的前 4 个字符进行索引,可降低索引文件大小.Mysql> create index ind_company_name on company(name(4));说明:ind_company_name 索引名,company

mysql索引优化面试题

曾经偷偷的面试了两个单位,都提到了Mysql的优化问题,所以以后要多多学习数据库的优化知识了.建设数据库的优化大概主要就是索引的优化了吧,因为我们不可能修改数据结构的情况下,提高数据库的查询效率似乎也只能用索引了.当然这也是建立在你sql语句写的比较科学的情况下,如果你的sql语句本身就写的比较垃圾,神仙也救不了你!下边是在网上找到的一些资料,保留下来备用吧1,创建索引对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索