转自: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慢查询 一、慢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 ...
1、添加索引sql语句 2、查看MySQL中建立的索引是否生效 3、索引失效场景(补充:以下在实际应用中并不会一定导致索引失效,基于mysql不同版本的优化规则) 3.1 在联合索引的场景下,查询条件不满足最左匹配原则 3.2 ...
例如,在一张表 test 中建立了联合索引(a,b,c),使用下面的 SQL 语句问那些语句用到了索引?根据索引的最左匹配原则,只有 1) select * from test where a; 和 2) select * from test where b; 两条语句会用到...
之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...
MySQL 聚簇索引、联合索引、覆盖索引、回表、索引下推 一篇文章讲清楚 MySQL 的聚簇、联合、覆盖索引、回表、索引下推 MySQL 的索引机制是数据库性能优化的关键,了解索引的类型和使用场景可以大大提高数据库的...
联合索引:索引列有多个字段,使用时需要满足最左前缀原则 普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: 1.创建索引 代码如下: CREATE INDEX indexName ON mytable(username(length)); ...
之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 最左前缀匹配原则 在mysql建立联合索引时会遵循最...
主要介绍了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法,总结分析了MySQL建表、编码设置、字段添加、索引操作所涉及的SQL语句,需要的朋友可以参考下
MySQL 的 Explain 分析 SQL 语句性能(慢查询和加没加索引) MySQL 的 Explain 分析 SQL 语句性能是数据库性能优化的重要工具之一。通过 Explain 命令可以分析 SQL 语句的执行计划,了解 SQL 语句的执行过程,找出...
接着介绍mysql底层存储实现段簇页,和聚簇索引非聚簇索引包括联合索引的关系。最后列举一些sql是否可走索引,涉及最左匹配原则、索引覆盖、范围查询等原则,以及sql优化建议。 笔者使用此ppt分享,取得了较好的现场...
索引的优化是面试中数据库部分可以说是必问的...2.2 没有使用联合索引的第一列,not in,!=,使用MySQL函数,类型转换,or等都无法用到索引。 3 SQL和索引的优化 3.1 慢查询日志 3.2 查磁盘的I/O读写的数据量 3.3 sh
可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: Select age ## 不使用索引 FROM people Where firstname='Mike' ## 考虑使用索引 AND lastname='...
本文实例讲述了MySQL联合索引。分享给大家供大家参考,具体如下: 员工表 userid 部门表 deptid 员工部门表 条件:一个员工可以对应多个部门 问题:怎么样设置数据库,让其不能重复添加 userid 和deptid? uuid ...
SQLyog 是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,而且它本身是完全免费的!!功能: 1、快速备份和恢复数据; 2、以GRID / TEXT 格式显示结果; 3、支持...
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 ...
比如:在userid 和 date字段上创建联合索引。 那么如果输入 userId作为条件,那么这个userid可以使用到索引,如果直接输入 date作为条件,那么将不能使用到索引。 3.匹配列前缀查询 比如: order_sn like ‘134%’...
联合索引 最左前缀匹配原则 剑建索引的建议 索引失效的场景 日志 MySQL的三个日志 事务 什么是事务? 事务的四大特性(ACID) 并发事务带来的问题 事务的隔离级别 MySQL事务的隔离级别通过什么实现? 什么是MVCC? 锁 ...
假设有一张t15表,在表中建立了一个联合索引:cp(cat_id,price) 当我们使用下面的sql语句,会出现索引覆盖的情况。不信我们可以来查看一下,这里的Extra中显示了Using index,表示这条sql语句刚好用到了索引覆盖...
MySQL 索引使用的注意事项 SQL怎么优化 数据库悲观锁和乐观锁的原理和应用场景? 如何做 MySQL 的性能优化? 索引是什么?MySQL为什么使用B+树,而不是使用其他?B+树的特点 创建索引时需要注意什么? CHAR和VARCHAR...