mysql 高性能查询_如何写出高性能的MySQL查询

如何写出高性能的MySQL查询

想写这样一篇文章很久了,但始终没有下手。最近帮同事看了几个查询,而且自己也在考虑一个索引系统的问题,所以今天就把这个写了。介绍一下MySQL的索引机制,还有一些MySQL查询的优化策略。鄙人才疏学浅,很可能说的不对,请路过的各位大侠批评指正,献丑了。

------------------- jiajun.org 官方分割线 ---------------------

首先,说说MySQL的索引存储方式。MySQL的索引一般是B-Tree的结构存储的,内存表也有Hash索引,但是内存表的出镜率似乎已经低到了用“可怜”来形容的程度,所以我们只考虑B-Tree索引。

然后说说MySQL的联合索引。联合索引对于一个DBMS总是非常重要的,因为每一条SQL语句的条件子句是单条件的可能性很小,大多数情况下为组合条件,因此对于组合索引的依赖也就很强。MySQL对于联合索引的创建规则通过一个例子说明:

对于一个在列:col_a, col_b和col_c上的联合索引,MySQL会建立

INDEX(col_a), INDEX(col_a, col_b)和INDEX(col_a, col_b, col_c)

这样三个索引。

介绍完一些基本原理,我们来看MySQL对于索引的选取规则和索引的建立原则(这些规则都是个人总结的,多来源于互联网,也有自己的经验)。

对于单个索引,一般来说MySQL的查询优化器总能在若干查询条件中选取效率较高的一个使用,所以不必投入太多精力,一般来说查询容易出现的问题容易出现在联合索引。这里以一个两列的索引为例,说明一些问题。

例如:

idx_a_b (col_a, col_b)

建立做和索引的列进行or组合不可使用索引

例如:有条件

col_a = val_a OR col_b = val_b

这个条件,是不可以使用idx_a_b索引的。然而同样的查询对于却可以使用这样的索引idx_a(col_a)或者idx_b(col_b)的,因此在建立索引的时候就要考虑到出镜率最高的条件是什么,建立怎样的索引。而如果同时存在idx_a和idx_b两个索引的话,MySQL也只会选择一个使用,尽可能使用索引把结果集缩小,再在这个结果集中遍历,使用其他条件筛选。

联合索引对非前缀列不生效

例如:条件col_b = val_b这个条件是不会使用这个索引的,因为索引idx_a_b的前缀列是col_a。因此在建索引的时候,就要注意到,是否有很多使用这种条件的查询,需要为col_b单独建立索引。

对于组合索引,遇到范围查询则放弃使用剩余部分

例如:条件

col_a = val_a AND col_b = val_b

是可以使用整个索引,而对于

col_a BETWEEN val_a_left AND val_a_right AND col_b = val_b

这个条件,只会使用索引的col_

相关文档:

mysql的存储引擎有几种,但是从5.0开时大部分是默认采用 innodb存储引擎。innodb存储引擎支持 事务,外键,行数据锁定(当然是相对myisam的表锁定)。magento安装的时候有检查 mysql是否支持innodb存储引擎,如果不支持则不能继续安装而提示如下错误,尽管innodb存储并没有被列为安装magento的前提条件之一。

Database&nbs ......

InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)、多版本并发控制(multi-versioned concurrency control)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行级锁(locking on row level),提供与 Oracle 类似的不加锁读取(non-locking read in SELEC ......

http://database.51cto.com/art/200910/155625.htm

本文的unique列上插入重复值解决方案,主要基于MySQL平台。通过这些,可以做到一些新的功能和应用。希望本文能对大家有所帮助。

当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子 ......

最近做了几周的LoadRunner测试,有一些心得,记录下来,以便以后查找。

LoadRunner测试数据库是模拟客户端去连接数据库服务器,因此,需要协议(或者说驱动的支持)。LoadRunner本身直接支持Oracle、SqlServer数据库,这两个数据库直接选择相应的协议就可以录制脚本。而MySql数据库 ......

安装mysql

sudo apt-get install mysql-server #直接自动获得可用版本

也可以这样写

sudo apt-get install mysql-server-5.0 #安装mysql服务器5.0版本

安装后

/etc/init.d/mysql start (stop) 为启动和停止服务器

/etc/mysql/ 主要配置文件所在位置 my.cnf

/var/lib/mysql/ 放置的是数据库表文件夹,这里的m ......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值