深入浅出Mysql(一)

1、慢查询基础:优化数据访问
对于低效率查询,我们可以通过以下两个步骤来分析总是有效的:
1、确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,当时有时候也可能访问了太多的列
2、确认Mysql服务器层是否在分析大量超过需要的数据行
1.1 是否向数据库请求了不需要的数据
典型案例
查询不需要的记录
在查询时,Mysql会先返回全部结果集再进行计算,客户端应用程序会接收全部的结果集数据,然后抛弃其中大部分数据。最简单有效的解决办法在查询后面加上limit
多表关联返回所有列
总是取出全部列
重复查询相同数据
比较好的解决办法是将这个数据缓存起来,需要的时候从缓存中取
1.2 Mysql是否在扫描额外的记录
对于Mysql,最简单衡量查询开销的三个指标是:
响应时间
扫描的行数
返回的行数
一般Mysql能够使用如下三种方式应用where条件,从好到坏一次为:
1、在索引中使用where条件来过滤不匹配记录。这是在存储引擎层完成。
2、使用索引覆盖扫描(在Extra列中出现Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在Mysql服务器层完成的,但无需再过滤表的查询记录
3、从数据表中返回数据,然后过滤不满足条件的记录(在Extra列出现Using where)。这在Mysql服务器层完成,Mysql需要先从数据表中读出记录然后过滤
2、重构查询的方式
如果有机会尽量分解关联查询,这样做的好处:
1、让缓存效率更高
2、执行单个查询时减少了锁的竞争
3、在应用层做关联,可以容易对数据库进行拆分,更容易做到高性能扩展
4、减少冗余记录查询
Mysql的存储引擎包括:Myisam、InnoDB、BDB、Memory、Merge、Example、NDB Cluster、CSV等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。
下面介绍几种常用的存储引擎:
1、Myisam:默认的Mysql插件式存储引擎,他是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一
2、InnoDB:用于事务处理应用程序,具有众多特性,包括ACID特性。
3、Memory:将所有的数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可以提供极快的访问
4、Merge:允许Mysql DBA或开发人员将一系列等同的Myisam表以逻辑方式组合在一起,并作为1个对象引用他们。对于数据仓储等环境十分适合
选择合适的数据类型
1、固定长度数据列char和可变长度数据列varchar
对于InnoDB存储引擎,内部的行存储格式没有区分固定长度和可变长度列(所有的数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度不一定比可变长度简单,建议使用varchar。他们的存储差别如下:
这里写图片描述
如果Mysql运行在严格模式,超过列的长度值不保存,并且会出现错误。
2、text和blob
blob和text值在执行了大量的删除或更新操作的时候,删除这种值会在数据表中留下很大的空洞,为了提高性能,建议定期使用optimize table功能对这类表进行碎片整理。
合成的散列索引对于那些blob或text数据列特别有用。用散列标识符值查找的速度比搜索blob列本身的速度快很多。
在不必要的时候避免检索大型的blob或text值
把blob或text列分离到单独的表中
索引的设计和使用
设计索引的原则
1、搜索的索引列不一定是索要选择的列。也就是说,最适合索引的列是出现在where字句中的列,或连接字句中指定的列,而不是select关键字后的选择列表中的列
2、使用唯一索引。
3、使用短索引。如果对串列进行索引,应该指定一个前缀长度,例如:如果一个char(200)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引,这样可以节省内存。
4、利用最左前缀。
5、不要过度索引
6、考虑在列上进行比较类型。索引可用于<,<=,=,>=,>,between

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试