• 7.31实习培训日志-docker sql


    docker

    mysql docker问题

    今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint。

    dockerfile中,从别人拉一个dockerfile,run等命令都是继承的,但是entrypoint和cmd不是继承的,是覆盖式的,最好不要覆盖这两个文件,如果需要修改,可以在官方原有entrypoint中提供的docker-entrypoint.sh中添加自己的需求。

    在mysql的镜像中,我们需要执行的一个SQL文件,可以直接放在/docker-entrypoint-initdb.d/下面直接会执行,最好不要用自己的sh去覆盖官方的docker-entrypoint.sh等,需要修改也最好在官方的基础上修改。

    SQL优化

    mysql优化

    理解驱动表:小结果集驱动大结果集

    1. 优化第一步:LEFT JOIN改为JOIN
    2. 尽量不要根据非驱动表的字段排序
    3. 优化第二步:去除所有JOIN,让MySQL自行决定!

    mysql分析

    1. type 为ALL表示全表扫描 需优化
    2. rows 返回尽量少的记录
    3. Extra列中的:using where 表示不走索引的过滤条件,using filesort表示没有用索引排序,using temporary表示用到临时表,考虑能否等价改写去掉它

    mysql开发规范

    不要把MySQL的存储过程和触发器视为洪水猛兽,用好的话,没有问题的,真遇到问题了再优化也不迟。另外,MySQL因为没有物化视图,因此视图能不用就尽量少用吧。

    其实从5.6开始,建议优先选择DATETIME存储日期时间,因为它的可用范围比TIMESTAMP更大,物理存储上仅比TIMESTAMP多1个字节,整体性能上的损失并不大。

    所有字段定义中,默认都加上NOT NULL约束,除非必须为NULL(但我也想不出来什么场景下必须要在数据库中存储NULL值,可以用0来表示)。在对该字段进行COUNT()统计时,统计结果更准确(值为NULL的不会被COUNT统计进去),或者执行 WHERE column IS NULL 检索时,也可以快速返回结果。

    尽可能不要直接 SELECT * 读取全部字段

    老叶观点:MySQL开发规范之我见: (推荐)

    “冒泡排序”在某些情况下(大多数数据是排好序的)其效率会高于所有的排序算法。

    字符串操作很费性能,无论是strcpy, strcat还是strlen,能用整型最好用整型。

    MYSQL性能优化

    为查询缓存优化你的查询

    -- 查询缓存不开启  NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存
    $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
    -- 开启查询缓存 用一个变量来代替MySQL的函数
    $today = date("Y-m-d");
    $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
    
    1. EXPLAIN 你的 SELECT 查询
    2. 当只要一行数据时使用 LIMIT 1
    3. 为搜索字段建索引
    4. 永远为每张表设置一个ID,好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。

    优化建议

    1. 可以存下我们数据的最小数据类型
    2. 使用简单的数据类型,int类型要比varchar类型,mysql处理更简单
    3. 尽量使用not null字段,因为innodb存储类型,尽量设置默认值
    4. 尽量少用text类型,非用不可的话需要考虑是否分表的方式解决。

    建议总是要在SQL中使用基表,而不是视图。

    索引使用

    1. 避免对索引字段进行计算操作
    2. 避免在索引字段上使用not,<>,!=
    3. 避免在索引列上使用IS NULL和IS NOT NULL (一定要作为索引列,考虑设置默认值)
    4. 避免在索引列上出现数据类型转换(包括隐式的类型转换)
    5. 避免在索引字段上使用函数
    6. 避免建立索引的列中使用空值。???

    数据库不建立外键,外键在业务层实现

    id不要用UUID

    数据库对比:Mysql vs Oracle

    自动增长的数据类型

    Mysql有自动增长的数据类型 auto_increment ;
    Oracle 没有自动增长的数据类型,需要建立一个序列 SEQUENCE;

    group by 用法

    Mysql 中 group by 在select 语句中可以随意使用;
    Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by 子句中的列,否则报错;

    引号问题

    Mysql中单双引号均可;
    Oracle以单引号包裹字符串,双引号包裹别名。

    oracle生成awr

    instantclient

    下载instantclient-basic和instantclient-sqlplus,注意选择合适的版本和平台,然后解压到同一个文件夹下,然后配置tns,在文件夹下建一个tnsname.ora文件,如下配置。然后配置tns环境变量位置,具体百度,这个Navicat和plsql develop登录需要配置的监听。

    winXP =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.70)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )
    

    sqlplus

    配置sqlplus的环境变量,然后sqlplus student1/student1@192.168.15.70:1521/orcl登录,注意需要有权限,需要提前授权然后才能生成awr报告,然后@+你的awrrpt.sql文件生成awr报告,默认在c盘你的用户目录下。
    sqlplus system/oracle@192.168.99.100:1521/xe

  • 相关阅读:
    getJson
    mongodb在java中的查询
    Fragment
    android权限
    json输出
    Android Service
    javascript
    android
    Myeclipse启动报错: Invalid 'log4jConfigLocation' parameter
    Android-Activity生命周期
  • 原文地址:https://www.cnblogs.com/sufferingStriver/p/9403474.html
Copyright © 2020-2023  润新知