Mysql 优化

参考:
http://thephper.com/?p=142
http://isky000.com/database/mysql-performance-tuning-sql

1.mysql系统结构分为两层
    Sql层:权限判断,sql解析,查询缓存,执行计划任务等
    存储引擎层:负责执行sql从磁盘中读取数据,支持多种存储引擎

2.一个查询sql的执行流程
    首先服务器端语言与mysql建立连接 -> 连接池 -> sql接口 -> parser解析器 -> optimizer优化器 -> cache和buffer(缓存) -> engine(存储引擎,搜索数据返回)

3.索引
    优点:提升查询速度,极大的减轻了mysql服务器的压力
    缺点:在大量数据的情况下,动态维护索引会消耗时间,数据的维护速度降低了

4.索引分类
    五种:普通索引,唯一性索引,全文索引,单列索引,多列索引(复合索引)
    存储分类:B-tree(平衡树),hash,聚簇
    myisam和innodb存储引擎默认都是B-tree索引,但是innodb有聚簇索引(在B-tree基础上增加了数据行称之为聚簇索引),只有memory存储引擎使用hash索引
    Hash索引的查询是通过计算hash值直接定位,效率要比b-tree索引高,但是在非等号判断、部分索引查询、排序时效率会没有b-tree高,同时避免不了对hash表的全表扫描,而b-tree存储方式让每个子节点的距离都是相同的,有利于检索速度,所以b-tree使用率更高,b-tree结构能显著减少定位数据时经历的中间过程,从而加快读取速度

5.创建索引注意
    a)选择唯一性,可以一次性定位数据(如:主键id)
    b)选择数据量少的字段
    c)为经常查询,排序,分组的字段做索引
    d)控制索引数目(索引多了占用空间,造成效率下降)
    e)删除不使用的或者很少使用的索引

6.Sql语句优化
    a)查看sql执行时状况使用 explain sql 可以查看详细
    b)使用查询时避免使用 * ,尽量使用字段查询
    c)在用到聚簇索引字段查询时必须匹配到第一列,否则索引无效
    d)使用or做条件时,一方无索引则该sql不会使用索引
    e)连接查询比嵌套查询效率高
    f)分页会全表扫描,可以使用索引进行排序,然后再分页
    g)对不需要排序的分组查询,sql语句后加order by null 可以省去默认排序,提升效率

7.分表优化
    水平分割:将一个表的数据分别存放在不同的表中,提升查询效率
    适用于:1.表很大,数据多、2.表中的数据本身就有独立性、3.数据需要存放到不同介质中
    垂直分割:将一个表的字段分别存放于不同表中,同一关联字段使用
    适用于:表中字段多,而且有的字段不常使用,可以分开保存

8.

你可能感兴趣的:(mysql)