SQL语句方面的优化
1:不要在sql语句中做运算,影响性能
2:优化查询时间长的sql语句(思考问题:如何发现有问题的sql语句?),尽量让其用到索引
如何发现有问题的sql语句?
慢日志 和 explain
#慢查询开启
slow_query_log = ON
#设置慢查询时间5s
long_query_time = 5
#设置慢日志存储位置(三种方式:file,table,file+table)
log_output = FILE,TABLE
explain参见文章‘’0基础也能看懂的mysql索引‘’博文末尾(如何知道自己的查询语句有没有用到索引?)
分区,分表?
分区:list,hash,range,key四种方式进行分区
分表:垂直分表(根据字段拆分表),水平分表(建立多个相同的表存储数据)
分表后如何保证插入的id唯一?
1:union联合查询出最大id
2:id存单独的表,每次添加数据先取id
3:id存缓存
大数据用户表如何分表?
1:先按字段拆分成用户表和用户信息表
2:再做水平拆分
分表后,用户登录怎么确定在哪个表?
1:新建一个crc32关系表,存储用户在哪个表里
2:查询用户信息先查关系表,确定在哪个表
订单如何分表(商家和用户角度)
1:系统存两份订单表,1份按照用户维度分表,1份按照商家维度分表
2:用户下订单时候,只按照用户维度分表
3:通过定时任务,把数据写入商家维度的表
mysql集群:主从 ,主主
主从原理:
主库发生改变写进二进制日志,通过slave线程通知从库的io线程把修改写到从库的中级日志,
从库的sql线程把数据写到从库完成同步
主主原理:
和主从原理类似,只是主从完成后,把从库当成主库链接以前的主库
出现的问题: 延时,主键冲突(高并发)
由于主库的写入是多线程的,从库的更新是单线程的,所以有延时
延时如何解决?
1:提高从库配置
2:强制从主库拿数据
3:使用中间件
4:使用缓存
5:改配置文件sync_binlog=1,让其每次改变都写磁盘
主键冲突如何解决?
1:改配置文件auto-increment-increment 和 auto-increment-offset,让其
自增量和自增起点发生改变