`
soartju
  • 浏览: 244933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】mysql联合索引 sql索引使用

阅读更多

转自:http://hi.baidu.com/lssbing/blog/item/b4fa993bc4876ee615cecbc5.html

 

注意:Index(Name,Age)表示在Name,Age两列上建立联合索引

由于索引对数据库的查询性能有着至关重要的影响,下面是我的一些总结和体会:

一个查询一次只能使用一个索引:select name from user where name='plantegg' and age>35 , 如果Index(name); Index(age)的话,MySQL查询优化器会自动选择一个索引来使用;
MySQL选择哪个索引,可以这样来看:mysql> show index from photo;
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name               | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| photo |           0 | PRIMARY                 |             1 | photo_id       | A         |       237871 |     NULL | NULL   |       | BTREE       |         |
| photo |           1 | index_random           |             1 | random         | A         |       237871 |     NULL | NULL   | YES   | BTREE       |         |
| photo |           1 | FK_photo_profile_id     |             1 | profile_id     | A         |       237871 |     NULL | NULL   |       | BTREE       |         |
| photo |           1 | FK_photo_temp_photo_id |             1 | temp_photo_id | A         |       237871 |     NULL | NULL   | YES   | BTREE       |         |
| photo |           1 | FK_photo_album_id       |             1 | album_id       | A         |       237871 |     NULL | NULL   | YES   | BTREE       |         |
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
Cardinality越大表示索引候选分得越细(默认都是BTree索引);
你也可以试试Force Index强制使用某个索引看看速度是不是MySQL是不是查询起来更快(如果真是这样的话你需要Analyze yourTable 了,MySQL重新计算你的Cardinality以帮助他正确地选择INDEX)
仔细分析Explain的结果:重点留意Extra,Key,Rows,Select_type的结果!
小心查询中的Group by 、order by之类的,基本上这样的查询在Explain的时候都会出现: Using where; Using temporary; Using filesort
联 合索引要小心使用,Index(Name,Age)时,如果where name='pp' 能使用索引,where age=25时不能使用索引;where name='pp' and age>25 能使用索引;     where name ='pp'   order by   age   能使用索引;   where   name>'pp'   order by age   不能使用索引,但是 where   name>'pp'   order by name,age   能使用索引,请仔细留意差异   ;   order by name asc age desc 将不能使用索引!
索引只有被加入到内存里的时候对你的查询才有帮助,如果索引太大根本无法放入内存这样的索引失去了意义!访问索引的时候还需要Random   Aceess   Disk这比不用索引还慢!
select   的 时候能不用select * 就不要用,也就是需要哪些列只拿那些列(Hibernate那些对性能没有啥好处的),比如:在Index(Name)的时候,select * from user where name like 'pp%' 和 select name from user where name like 'pp%' 两者性能千差万别,如果有10000条符合记录的结果的话(User表总共有10亿条记录)前一个查询可能需要2分钟(假设你的系统每秒100 IOPS的样子)后一个查询可能只需要0.01秒!因为前一个查询要从硬盘上取出散布在到处的这10000条记录,后一个查询直接从内存中的索引上拿 Name就够了!后一个查询你explain的时候在Extra中会看到Using Index。

永远要警惕对磁盘的随机访问,顺序读写 和随机访问的性能差别是N个数量级的(顺序读写的时候你的OS、Dish Cache 这个时候大显身手)对这个问题如果感兴趣的话建议你去用C写个测试程序,随机读写的时候不断地fseek,相应地同样的功能你不要fseek而是通过顺序 读写到内存中,在内存自己扔掉那些应该由磁盘去fseek的地方,应该明白我的意思吧!
5.0.27后,MYSQL就支持set profling=1了,这样可以详细分析你的SQL语句每一步骤的时间消耗了
如果order by 的时候有 limit + 索引配合的话,你会有意外惊喜的。

 

 

分享到:
评论

相关推荐

    MySQL联合索引功能与用法实例分析

    本文实例讲述了MySQL联合索引功能与用法。分享给大家供大家参考,具体如下: 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如...

    通过联合索引优化MYSQL慢查询

    通过联合索引优化MYSQL慢查询 一、慢SQL分析 慢SQL如下 SELECT SUM(t.amount) as amount FROM (SELECT game_id,room_id,is_robot,amount,record_time FROM t_statements_logs WHERE game_id = 30 AND is_robot = 0 ...

    Mysql面试过关!(详解:索引+常用引擎+常见问题+sql调优)

    1、添加索引sql语句 2、查看MySQL中建立的索引是否生效 3、索引失效场景(补充:以下在实际应用中并不会一定导致索引失效,基于mysql不同版本的优化规则) 3.1 在联合索引的场景下,查询条件不满足最左匹配原则 3.2 ...

    mysql面试题,涉及MySQL基础、MySQL索引、MySQL语句 MySQL进阶等方面,适用于初、中级开发人员

    例如,在一张表 test 中建立了联合索引(a,b,c),使用下面的 SQL 语句问那些语句用到了索引?根据索引的最左匹配原则,只有 1) select * from test where a; 和 2) select * from test where b; 两条语句会用到...

    MySQL组合索引与最左匹配原则详解

    之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...

    一篇文章讲清楚MySQL的聚簇-联合-覆盖索引、回表、索引下推.doc

    MySQL 聚簇索引、联合索引、覆盖索引、回表、索引下推 一篇文章讲清楚 MySQL 的聚簇、联合、覆盖索引、回表、索引下推 MySQL 的索引机制是数据库性能优化的关键,了解索引的类型和使用场景可以大大提高数据库的...

    MySQL索引不会被用到的情况汇总

    联合索引:索引列有多个字段,使用时需要满足最左前缀原则 普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: 1.创建索引 代码如下: CREATE INDEX indexName ON mytable(username(length)); ...

    深入浅析Mysql联合索引最左匹配原则

    之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 最左前缀匹配原则 在mysql建立联合索引时会遵循最...

    MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结

    主要介绍了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法,总结分析了MySQL建表、编码设置、字段添加、索引操作所涉及的SQL语句,需要的朋友可以参考下

    mysql的explain分析sql语句性能(慢查询和加没加索引)

    MySQL 的 Explain 分析 SQL 语句性能(慢查询和加没加索引) MySQL 的 Explain 分析 SQL 语句性能是数据库性能优化的重要工具之一。通过 Explain 命令可以分析 SQL 语句的执行计划,了解 SQL 语句的执行过程,找出...

    【含动画效果】mysql索引原理与最佳实践.pptx

    接着介绍mysql底层存储实现段簇页,和聚簇索引非聚簇索引包括联合索引的关系。最后列举一些sql是否可走索引,涉及最左匹配原则、索引覆盖、范围查询等原则,以及sql优化建议。 笔者使用此ppt分享,取得了较好的现场...

    MySql数据库优化之SQL和索引的优化

    索引的优化是面试中数据库部分可以说是必问的...2.2 没有使用联合索引的第一列,not in,!=,使用MySQL函数,类型转换,or等都无法用到索引。 3 SQL和索引的优化 3.1 慢查询日志 3.2 查磁盘的I/O读写的数据量 3.3 sh

    MySQL索引使用说明(单列索引和多列索引)

    可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: Select age ## 不使用索引 FROM people Where firstname='Mike' ## 考虑使用索引 AND lastname='...

    MySQL联合索引用法示例

    本文实例讲述了MySQL联合索引。分享给大家供大家参考,具体如下: 员工表 userid 部门表 deptid 员工部门表 条件:一个员工可以对应多个部门 问题:怎么样设置数据库,让其不能重复添加 userid 和deptid? uuid ...

    SQLyog 图形化管理MYSQL数据库的工具

    SQLyog 是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,而且它本身是完全免费的!!功能: 1、快速备份和恢复数据; 2、以GRID / TEXT 格式显示结果; 3、支持...

    MySQL中的联合索引学习教程

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 ...

    mysql 索引详细介绍

    比如:在userid 和 date字段上创建联合索引。 那么如果输入 userId作为条件,那么这个userid可以使用到索引,如果直接输入 date作为条件,那么将不能使用到索引。  3.匹配列前缀查询 比如: order_sn like ‘134%’...

    MySQL自整理超全精华版面试八股文

    联合索引 最左前缀匹配原则 剑建索引的建议 索引失效的场景 日志 MySQL的三个日志 事务 什么是事务? 事务的四大特性(ACID) 并发事务带来的问题 事务的隔离级别 MySQL事务的隔离级别通过什么实现? 什么是MVCC? 锁 ...

    mysql索引覆盖实例分析

    假设有一张t15表,在表中建立了一个联合索引:cp(cat_id,price) 当我们使用下面的sql语句,会出现索引覆盖的情况。不信我们可以来查看一下,这里的Extra中显示了Using index,表示这条sql语句刚好用到了索引覆盖...

    常见(MySQL)面试题(含答案).docx

    MySQL 索引使用的注意事项 SQL怎么优化 数据库悲观锁和乐观锁的原理和应用场景? 如何做 MySQL 的性能优化? 索引是什么?MySQL为什么使用B+树,而不是使用其他?B+树的特点 创建索引时需要注意什么? CHAR和VARCHAR...

Global site tag (gtag.js) - Google Analytics