• Mysql的一些常用方法


    公司近期为新来同事做了一次培训,我也偷偷溜进去观摩了一下,内容虽然很基础,但是还是挺有用的。这里做了一下资料汇总:

    2种存储引擎

    InnoDB:支持事务处理、外键、行级锁,游戏业务库使用
    MyISAM:不支持事务,写入速度快,游戏日志库使用

    什么样的查询会用到索引

    最左前缀原理(索引条件紧跟where)
    1.全列匹配,按照索引中所有列进行精确匹配(这里精确匹配指”=”或”IN”匹配)
    2.最左前缀匹配
    3.查询条件用到了索引中列的精确匹配,但是中间某个条件未提供:用到索引(只用到最左)
    4.使用like查询,%不能在第一位 ,如:
    s_rolename like ‘南博%’:使用索引
    s_rolename like ‘%南博’:不使用索引
    所以如果列要模糊查询,可在前面添个字段,如'0南博万'
    5.一次查询只会用到一个索引,查询时尽量遵循最左前缀原理
    如果有多个索引匹配,则默认优先按照索引建立顺序启用

    什么样的查询不会用到索引

    1.查询条件中不包含索引列
    2.索引列使用了函数或者表达式
    3.使用了like,%在最前面

    查询原则

    1.只取出自己需要的列
    select n_roleid,s_rolename from player_roles where n_roleid=1;
    这里n_roleid是传进去的,可以不放到查询结果中
     
    2.关联查询时永远用小结果集驱动大结果集
    SELECT
      pr.s_rolename,
      t.*
    FROM (SELECT
            n_roleid,
            n_lv
          FROM player_property pp
          WHERE pp.n_lv >= 30) t
      INNER JOIN player_roles pr
    WHERE t.n_roleid = pr.n_roleid

    存储过程

    过程内的变量定义:
    DECLARE  p_count1 INTEGER(11) DEFAULT 0;
    SET @p_count2=0;
    DECLARE:局部变量,作用范围是声明该变量的BEGIN...END块
    SET:会话内全局变量,作用范围是当前会话,可以在SQL、PROC、FUNC之间传递,使用不当可能会出BUG:
    比如2个过程都使用这个全局变量,则可能会出现变量被串用,因此在使用前建议初始化,SET @p_count2=0;
     
    锁(SELECT … FOR UPDATE)
    行级锁
      明确指定主键且有数据,无数据时没有锁
      select n_money,n_token into … from acc_balance where n_roleid=1 for update
    表级锁
      没有指定主键或者主键不明确
      select * from acc_balance where n_roleid<>1 for update;

    数据库操作

    登录数据库
    mysql --default-character-set=utf8 -uroot -p'123' -h192.168.0.14 -P3300 king_db
     
    --default-character-set:设定client的字符编码
    -u:登录用户
    -p:密码
    -h:指定HOST
    -P:指定端口
     
    导入数据库脚本
    mysql --default-character-set=utf8 -uroot -p'123' -h192.168.0.14 -P3300 king_db<目录/脚本
    mysql>source 目录/脚本
     
    导出数据库脚本(mysqldump)

    常用参数名

    描述

    --no-create-db,-n

    没有CREATE DATABASE...

    --no-data,-d

    只导结构,不导数据

    --database,-B

    有CREATE TABLE…

    --no-create-info,-t

    没有CREATE TABLE…

    --tables

    指定需要导出的表,覆盖--database或-B选

    --ignore-table

    指定不需要导出的表

    每次只能指定一个表,多个表需要重复多次指定

    每个表必须同时指定数据库和表名db.tablename

     
    示例
    -- 导出全库结构
        mysqldump -uroot -p123 -h192.168.0.26 -P3301 -B --opt -R -d playboy_cn_cn_test > struct.sql
    -- 导入结构
        mysql --default-character-set=utf8 -uroot -p123 -h127.0.0.1 -P3306 < struct.sql
    -- 导出数据
        mysqldump -uroot -p123 -h192.168.0.26 -P3301 --opt -t playboy_cn_cn_test > data.sql
    -- 导入数据
        mysql --default-character-set=utf8 -uroot -p123 -h127.0.0.1 -P3306 playboy_cn_cn_test < data.sql
     
    最后附上本次培训的PPT以及一些Mysql执行脚本,可简化部分日常工作:http://files.cnblogs.com/cm4j/mysql.zip
     
    原创文章,请注明引用来源:CM4J
     
  • 相关阅读:
    App性能测试工具-PerfDog
    痛并快乐着
    SQLyog连接MySQL的前前后后
    组合模式
    Java并发编程:线程池的使用
    高效能人事的七个习惯
    Spring中Bean的生命周期及其扩展点
    (转)第一次有人把“分布式事务”讲的这么简单明了
    分布式事物
    mybatis学习笔记(2)基本原理
  • 原文地址:https://www.cnblogs.com/cm4j/p/mysql_usage.html
Copyright © 2020-2023  润新知