mysql优化


一:存储引擎

答:常用的主要分为两种,一种是innodb,一种是myisam,两者的主要区别是

①myisam不支持事务处理,而innoDB支持事务处理

②myisam 不支持外键,innoDB支持外键

③myisam支持全文检索,而innoDB在MySQL5.6版本之后才支持全文检索

④数据的存储形式不一样,mysiam表存放在三个文件:结构、索引、数据,innoDB存储把结构存储为一个文件,索引和数据存储为一个文件

⑤myisam在查询和增加数据性能更优于innoDB,innoDB在批量删除方面性能较高。

⑥myisam支持表锁,而innoDB支持行锁

二:字段类型

(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
4)尽可能使用not null定义字段
5)尽量少用text,非用不可最好分表

 

举例:(1)价钱:decimal

(2) 手机号:char(10)

(3) 

三:索引

答:索引主要有:

      主键索引:数据记录里面不能有null,数据内容不能重复,在一张表里面不能有多个主键索引。

      普通索引:使用字段关键字建立的索引,主要是提高查询速度

      唯一索引:字段数据是唯一的,数据内容里面能否为null,在一张表里面,是可以添加多个唯一索引。

      全文索引:在比较老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我们一般使用sphinx集合coreseek来实现中文的全文索引。

      复合索引:最左原则

 

四:分区分表

分区

list :条件值为一个数据列表。

Range(范围) 

这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分

数据量打的时候便于查询

分表

(1) 纵向分表  数据字段较多,把常用的字段和不长用的字段分开

(2) 横向分表  和分区一样

五:主从复制

 

原理:主从复制一共有三个进程,从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

 

 

 

 

 

 

 

 

 

 

.sql语句优化

☆选择合适的数据类型

(2)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
4)尽可能使用not null定义字段
5)尽量少用text,非用不可最好分表

 ☆ 加索引

注意

  1.对于创建的多列(复合)索引,只要查询条件使用了最左边的列,索引一般就会被使用。 (最左原则);

 2.对于使用like的查询,查询如果是”%aaa”,不会使用到索引,‘aaa%’会使用到索引。

 3.搜索中文 如:根据电影的剧情查找电影的名称,根据歌词查找歌名。like ‘%爱请%

使用全文索引来解决,可以使用第三方查询工具,sphinx

4. 如果条件中有or,则要求or的索引字段都必须有索引,否则不能用到索引。

5. 如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。

6. 优化group by语句

   默认情况下, mysql对所有的group by col1,col2进行排序。这与在查询中指定order by col1,col2类型,如果查询中包括group by 但用户想要避免排序结果的消耗,则可以使用order by null禁止排序。

7. 当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。

8.前缀索引

利用字段数据的前部分作为索引,称为前缀索引。减少索引长度,提高索引效率。

比如:统计密码的前7个字符,作为不相同匹配条件,几乎可以做到1:1

此时,就可以利用前7个字符做索引关键字即可(离散程度高)

 

语法:

alter table 表名 add index (passwd(7)) 指定前7位作为索引关键字。

不使用索引前缀,索引的长度。

9.使用limit对查询结果的记录进行限定
10.避免select *,将需要查找的字段列出来
11.使用连接(join)来代替子查询
12.拆分大的delete或insert语句

二.分页优化

 翻页的sql语句:

select * from table_name   limit  offsetlength

使用如上语句,在翻页时,翻到最后,越来越慢,

原因:并不是跨过offset行,取出n条,

是取出offset+N条数据,舍弃前面的offset行,只取出n条数据。

如何解决?

1从业务上去解决:

办法:不允许翻过100页,

以百度为例,一般翻页到70页左右,谷歌40页左右

2)不用offset,用条件查询,条件中使用id查询,使用到了索引,

select * from user limit 10000,10;

select * from user where id>10000 limit 10;     

下一页:select * from user where id>10000+10 limit 10

该种方式要注意:如果有数据被删除,会导致select * from user limit 10000,10;

select * from user where id>10000 limit 10;语句取出的结果不一样,。

 因为数据在磁盘中被删除掉了(物理删除),结构发生改变,两者的查询的结果不一致,

 要想使结果一致,不能进行物理删除,给表增加一个字段来区分是否删除。

3)假如不能使用限制翻页到100页,数据有删除,还要求翻页,速度不能受影响。

思路:通过翻页,先取出id(主键),在根据id取出数据。

select name,age,email from  user inner join (select id from user limit 10000,10) as tmp on tmp.id=user.id

非要物理删除,还要用offset精确查询,还不限制用户分页,怎么办

我们现在必须要查,则只查索引,不查数据,得到id 

再用id去查具体条目,这种技巧就是延迟索引。 

三.分区.分表

四.主从复制、读写分离

14:优化需要用到哪些中间件?

主从复制:

主库挂掉:MHA

原理:

1)从宕机崩溃的master保存二进制日志事件(binlog events);

2)识别含有最新更新的slave;

3)应用差异的中继日志(relay log)到其他的slave;

4)应用从master保存的二进制日志事件(binlog events);

5)提升一个slave为新的master;

6)使其他的slave连接新的master进行复制;

一主多从如何读数据:atlas

负载均衡一台服务器挂掉如何切换:keepalived   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值