`
soartju
  • 浏览: 247419 次
  • 性别: 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的索引优化

    假设我们需要频繁查询`firstname`和`lastname`字段,那么可以考虑在这两个字段上创建一个联合索引: ```sql ALTER TABLE people ADD INDEX idx_firstname_lastname (firstname, lastname); ``` 这样,当执行类似于...

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

    MySQL联合索引,也称为复合索引,是提高数据库查询性能的重要工具。它允许在一个索引中同时包含多个列,从而使得查询能够更快地定位到所需的数据行。联合索引的关键在于其列的顺序,因为MySQL会从左到右依次使用索引...

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

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

    mysql 索引与执行计划

    通过使用`EXPLAIN`关键字,我们可以模拟优化器执行SQL查询的过程,并了解MySQL是如何处理特定SQL语句的。这对于分析查询性能和识别潜在的性能瓶颈非常有用。 ###### 1.2.2 执行计划的作用 执行计划的主要作用包括...

    MySQL全文索引、联合索引、like查询、json查询速度哪个快

    本文将深入探讨全文索引、联合索引、LIKE查询以及JSON查询这四种不同方法在实际应用中的速度比较,并通过实例进行详细解析。 首先,全文索引(Full-text Index)是MySQL提供的一种特殊类型的索引,专门用于提高全文...

    MySQL索引原理及慢查询优化1

    在示例SQL中,创建一个包含`status`, `operator_id`, `type`, `operate_time`的联合索引,并且考虑到`operate_time`的范围查询,应将其放在索引的最后。 4. **查询优化** 优化慢查询不仅涉及索引的创建,还包括...

    通过联合索引优化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索引失效.docx MySQL索引失效是指在查询执行过程中,数据库无法有效地使用索引来提高查询性能

    根据文章提供的数据表结构及索引设置,我们可以进一步分析索引使用的有效性。 **表结构及索引**: - 联合索引:`sname`, `s_code`, `address` - 主键索引:`id` - 普通索引:`height` **SQL案例分析**: 1. **...

    一个案例彻底弄懂如何正确使用mysql inndb联合索引

    MySQL InnoDB 联合索引是数据库性能优化的关键元素,尤其在处理复杂查询时。本文将通过一个具体的案例深入解析如何正确使用InnoDB联合索引来提升查询效率。 案例描述了一个业务查询,目的是获取最新审核的5条在线...

    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 联合索引与Where子句的优化 提高数据库运行效率

    总结起来,优化MySQL数据库性能的关键在于合理使用联合索引,并理解Where子句的执行顺序。创建合适的索引可以大大提高查询效率,但同时也需要避免索引失效的情况,如不当使用`OR`。同时,编写查询时,需考虑Where...

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

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

    76当我们在SQL里进行分组的时候,如何才能使用索引?.pdf

    为了在使用GROUP BY时利用索引,通常推荐的策略是创建联合索引,并确保GROUP BY语句中的字段能够匹配索引中最左侧的字段。这样做可以让数据库查询优化器更倾向于使用索引来进行分组操作。索引的顺序性允许数据库快速...

    MYSQL SQL开发从零开始学

    MYSQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)作为数据管理的主要工具。SQL是一种专门用来访问和处理数据库的标准编程语言。对于新手来说,从零开始学习MYSQL SQL开发需要...

    mysql关于索引的面试题

    2. **联合索引**:如果在联合索引的条件中,只有部分列被用作等值查询,而后面的列被用作范围查询,那么从范围查询的列开始的索引将不会被使用。 3. **不等于操作(!= 或 )**:不等于操作通常不会利用到索引,除非...

    sql优化中出现的索引合并问题(多条件查询时使用单索引还是联合索引)

    这是因为MySQL在处理这些查询时可能会进行索引合并,即使用两个独立的索引来查找匹配的数据,而不是利用可能存在的联合索引。 当我们有两个单独的索引(如`anchor_id`和`consume_scene`),在多条件查询时,如果...

Global site tag (gtag.js) - Google Analytics