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

MYSQL使用心得(九)----联合索引

 
阅读更多
注意: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-connector-java-8.0.27 jar包

    mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 ...

    mysql高级笔记 P1 day01-02. MySQL 高级 - Linux上安装MySQL P2 day01-03. MyS

    MySQL 高级 - 索引 - 索引分类 P9 day01-10. MySQL 高级 - 索引 - 索引语法 P10 day01-11. MySQL 高级 - 索引 - 索引设计原则 P11 day01-12. MySQL 高级 - 视图 - 概述 P12 day01-13. MySQL 高级 - 视图 - 创建及...

    mysql-binlog-connector-java-0.21.0-API文档-中文版.zip

    赠送jar包:mysql-binlog-connector-java-0.21.0.jar; 赠送原API文档:mysql-binlog-connector-java-0.21.0-javadoc.jar; 赠送源代码:mysql-binlog-connector-java-0.21.0-sources.jar; 赠送Maven依赖信息文件:...

    mysql-installer-community-5.7.31.0

    mysql-installer-community-5.7.31.0 mysql-installer-community-5.7.31.0 mysql-installer-community-5.7.31.0 mysql-installer-community-5.7.31.0 mysql-installer-community-5.7.31.0 mysql-installer-community...

    mysql连接包mysql-connector-java-5.1.27.jar

    6. **连接池**:在实际应用中,为了优化性能和资源利用,通常会使用连接池(如C3P0、HikariCP等),这需要在配置连接池时引入`mysql-connector-java-5.1.27.jar`。 7. **版本兼容性**:`5.1.27`版本的驱动适用于...

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    在实际开发中,你可以将`mysql-connector-java-5.1.10.jar`添加到项目的类路径(classpath)中,或者在Maven或Gradle等构建工具的依赖管理中指定对应的版本,以确保Java应用能够找到并使用这个驱动。 总结,`mysql-...

    mysql-connector-java-8.0.22.jar

    包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-...

    mysql驱动包mysql-connector-java-5.1.7-bin.jar

    mysql-connector-java-5.1.7-bin.jar

    mysql驱动包mysql-connector-java

    包括以下文件 mysql-connector-java-3.0.16-ga-bin.jar mysql-connector-java-3.1.8-bin.jar mysql-connector-java-3.1.13-bin.jar mysql-connector-java-5.0.5-bin.jar

    MySQL的jar包,包含mysql-connector-java-5.1.49和mysql-connector-j-8.1.0

    mysql57驱动jar包,jar包...mysql-connector-java是一款由mysql推出的官方驱动,它是java通过JDBC连接操作mysql的驱动,解压之后是jar包,需安装Java环境方可使用。需要mysql connector java的朋友们可以前来下载使用。

    Mysql5.7.37-rpm安装包(aarch64平台)

    mysql-community-client-5.7.37-1.ky10.ky10.aarch64.rpm mysql-community-common-5.7.37-1.ky10.ky10.aarch64.rpm mysql-community-devel-5.7.37-1.ky10.ky10.aarch64.rpm mysql-community-embedded-5.7.37-1.ky10....

    mysql-connector-java-5.1.27

    综上所述,`mysql-connector-java-5.1.27`是Java开发者与MySQL数据库交互的基础,理解其工作原理和使用方法对于开发基于Java的数据库应用至关重要。正确地配置和使用此驱动包,可以使Java应用高效、稳定地访问和操作...

    mysql57-community-release-el7-7.noarch.zip

    在CentOS 7操作系统上安装MySQL 5.7时,由于CentOS 7默认的软件仓库中包含了MariaDB(MySQL的一个分支),直接使用`yum install mysql-server`命令会安装MariaDB而非MySQL。因此,为了安装MySQL 5.7,我们需要添加...

    mysql-connector-odbc-8.0.15-winx64/32.msi

    在本压缩包中,我们有两个版本的MySQL Connector/ODBC驱动程序,分别是`mysql-connector-odbc-8.0.15-winx64.msi`和`mysql-connector-odbc-8.0.15-win32.msi`,分别适用于64位和32位的Windows操作系统。 1. **MySQL...

    mysql-connector-java-5.1.25, mysql 5.7.31亲测有效

    5. 解压和压缩:如果`mysql-connector-java-5.1.25.jar`在某些环境中无法直接使用,可以尝试将其解压缩后再重新打包为ZIP格式。有时,某些系统或工具可能不支持JAR文件,而ZIP格式则更为通用。 总的来说,`mysql-...

    mysql驱动包 mysql-connector-java-5.1.7-bin.jar

    MySQL驱动包`mysql-connector-java-5.1.7-bin.jar`是用于Java应用程序与MySQL数据库之间通信的重要组件。这个驱动程序实现了Java Database Connectivity (JDBC) API,使得Java开发者可以利用标准的JDBC接口来操作...

    mysql-connector-java-5.1.7-bin.jar

    使用"mysql-connector-java-5.1.7-bin.jar"时,需要将其添加到Java项目的类路径中。这可以通过多种方式实现,例如在IDE(如Eclipse或IntelliJ IDEA)中设置库依赖,或者在命令行运行Java程序时使用`-cp`或`-...

    mysql-8.0.20-el7-x86_64.tar.gz mysql-8.0.20安装包下载

    提供的压缩包文件名为`mysql-8.0.20-el7-x86_64.tar.gz`,这是一个针对64位系统的tar归档文件,包含了所有必要的二进制文件和配置文件。 ### MySQL 8.0.20概述 MySQL 8.0.20是MySQL数据库的一个重大更新,它引入了...

    mysql-connector-java-5.6-bin.jar

    支持mysql-connector-java-5.6,mysql-connector-java-5.0.X以上

Global site tag (gtag.js) - Google Analytics