zoukankan      html  css  js  c++  java
  • 专题《一》 mysql优化

    从今天开始,在这里记录面试会问的问题,针对java高级开发,架构师方向。

    1.数据库设计要合理。开发经验不同  设计表水平不同  影响后面操作

      三范式:1------------原子约束,每列不可分割                           具体看业务,比如地址

          2------------主键唯一

          3------------不要有冗余数据

    2.添加索引(普通   index,主键   primary·,唯一  unsigned,全文,

          组合索引   alter table dept add index my_ind (dname,loc); )                                 mysql优化,重点索引优化

     折半查询

    mysql----mysql  server5.5----data---数据库名---每个数据库有      MYD表数据     MYI索引文件    frm表结构   三个文件

    底层:b+树               将索引排列成树的结构。   选取一个中间数,小的总是在左边,大的总是在右边

        2的n次方查找速度。    比如2的5次方个数据,只需要查找5次。

    缺点:增加,删除,索引文件需要更新。

    MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。比如我们要分析如下SQL语句:

    explain select * from table where table.id = 1 

    运行上面的sql语句后你会看到,下面的表头信息:

    table | type | possible_keys | key | key_len | ref | rows | Extra

    总结:满足一下条件的字段,才应该创建索引

    ①  肯定在where条件经常使用

    ②  该字段的内容不是唯一的几个值

    ③  字段内容不是频繁变化

    实际企业中不会使用全文索引:

     第三方搜索引擎框架:es,slor

    3.分表分库(分表:减轻单张表压力   分库:根据项目分库)

    分表:根据年限,尾数,     取模根据尾数

    4.读写分离

     篇幅较多,在下一篇阐述

    5.存储过程   ( 就是一块sql语句,提升执行效率,但是灵活性不高)

    6.配置mysql最大连接数

     

    7.mysql服务器硬件升级

     

    8.随时清理碎片化

    9.sql语句调优

    ①  使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,

    在group by 后面增加 order by null 就可以防止排序.

    explain select * from emp  group by deptno order by null;

    ②  有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

    select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式]

    select * from dept left join emp on dept.deptno=emp.deptno;  [左外连接,更ok!]

    ③  对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

    应尽量避免在 where 子句中对字段进行 null 值判断

    模糊查询在like前面有百分号开头会失效。

    如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字

    10.定位慢查询

     mysql默认慢查询10s

    //显示慢查询次数

    show status like 'slow_queries';

    --查询慢查询时间

    show variables like 'long_query_time';

    --修改慢查询时间

    set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值

    如何将慢查询位到日志中

    在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以

    binmysqld.exe --safe-mode  --slow-query-log [mysql5.5 可以在my.ini指定](安全模式启动,数据库将操作写入日志,以备恢复)

    binmysqld.exe log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

    先关闭mysql,再启动, 如果启用了慢查询日志,默认把这个文件放在

    my.ini 文件中记录的位置:

    #Path to the database root

    datadir=" C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

    mysql存储引擎

    inndb(主流),        ------------事务机制

    myisam,

    memory

    MyISAM 和 INNODB的区别

    1. 事务安全(MyISAM不支持事务,INNODB支持事务)

    2. 查询和添加速度(MyISAM批量插入速度快)

    3. 支持全文索引(MyISAM支持全文索引,INNODB不支持全文索引)

    4. 锁机制(MyISAM时表锁,innodb是行锁)

    5. 外键 MyISAM 不支持外键, INNODB支持外键. (在PHP开发中,通常不设置外键,通常是在程序中保证数据的一致)

    Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快. (如果mysql重启的话,数据就不存在了)

    如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理:具体表现为清除数据后,myd文件大小不会减小

  • 相关阅读:
    Field 'CID' doesn't have a default value
    HTTP Status 500
    Exceprtion:e createQuery is not valid without active transaction; nested exception is org.hibernate.HibernateException: createQuery is not valid without active transaction
    SSH框架中hibernate 出现 user is not mapped 问题
    解决Exception:Could not open Hibernate Session for transaction; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/transaction/spi/TransactionContext
    在浏览器上直接输入 http://www.bookEstore.com就可以访问工程问题
    JavaWeb之动态页面技术JSP/EL/JSTL
    ConvertUtils.reqister注册转换器
    编写组件TComponent published $M+ 问题
    inherited 的研究。
  • 原文地址:https://www.cnblogs.com/a1304908180/p/10549693.html
Copyright © 2011-2022 走看看