日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【mysql】mysql优化

發布時間:2023/12/9 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【mysql】mysql优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,表設計
  1.1. E-R(entity relation)實體關系圖
    長方形 實體 表
    橢圓形 屬性 字段
    菱形 關系 一對一 多對一 屬于 多對多
  1.2. 三范式標準
    原子性
      個人信息
      省市縣鄉鎮
    唯一性
      主鍵 id
    無冗余性
      訂單表中的商品名稱與價格應該關聯查詢商品表
    三范式并不絕對。
  1.3. 選擇合適的存儲引擎
    查詢效率
      myisam快
      innodb慢
    事務
      myisam不支持
      innodb支持
    全文索引
      myisam支持
      innodb不支持
      兄弟連,研究生命,和特朗普通話,別插嘴。
    鎖機制
      myisam表鎖
        即鎖定一張表,如果進行讀操作,則其他進程不允許寫,如果進行寫操作,則其他進程不允許讀,更不允許寫
      innodb行鎖
        即鎖定一條記錄,其他進程可以對其他記錄進行讀寫操作,
    文件存儲區別
      myisam有三個文件
        .frm
        .myd
        .myi
      innodb有兩個文件
        .frm
        .idb
      總結
        查詢頻繁的使用myisam,例如新聞系統
        安全性要求高的使用innodb,例如商城系統

  注意: 選擇合適的字段類型
    數字->時間->枚舉->字符串
    盡量不要使用 null 類型
二,備份
  2.1. 普通備份
    mysqldump -uroot -p123456 database > /tmp/bak.sql
    mysqldump -uroot -p123456 --all-databases --events > /tmp/bak.sql
  計劃任務
    linux
    windows
  2.2. 增量備份
    增量備份(incremental backup)是備份的一個類型,備份上一次備份后的所有有變化的文件。
    1.?配置
      vim /etc/my.cnf
      log-bin=bin-log
      開啟二進制日志
    2.?查看
      /usr/local/mysql/data/mysql-bin.000001
      二進制日志文件位置
      mysqlbinlog mysql-bin.000001
    3. 恢復
      (1)通過時間
        mysqlbinlog --stop-datetime="2017-05-06 06:01:30" mysql-bin.000001 | mysql -uroot -p
      (2)通過位置
        mysqlbinlog --stop-position="3068" mysql-bin.000001 |mysql -uroot -p
    4. 重置
      reset master
    5.?案例
      CREATE DATABASE lizhaohui;
      USE lizhaohui;
      CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL);
      reset master
      在創建完庫表之后,再執行二進制日志文件記錄。
      INSERT INTO users(name) VALUE('aaaaa');
      INSERT INTO users(name) VALUE('bbbbb');
      INSERT INTO users(name) VALUE('ccccc');
      INSERT INTO users(name) VALUE('ddddd');
      INSERT INTO users(name) VALUE('eeeee');
      INSERT INTO users(name) VALUE('fffff');
三,優化
  3.1. 定位慢語句
    vim /etc/my.cnf
      [mysqld]
      slow-query-log=1 # 開啟記錄慢查詢的操作
      slow-query-log-file=slow.log #文件默認存放在mysql的data目錄下
      long-query-time=1 #不能使用小數
    重啟 mysql
      mysqladmin -uroot -p shutdown
      mysqld_safe -u mysql &
    快速插入數據
      INSERT INTO users(name) SELECT name FROM users;
  3.2. 處理
    1.?增加,刪除,修改
      查看服務器 cpu 和 內存使用率
      top命令
      一張表記錄不要超過100萬條
        SELECT COUNT(*) FROM users;
      檢查表索引不宜過多
        SHOW INDEX FROM users;
      分庫分表
    2.?查詢
      緩存
      語句分析
        explain 指令
          EXPLAIN SELECT * FROM users;
        type(連接類型)
          好壞順序
            system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
          system
          const
            表中滿足條件的記錄最多一條,使用主鍵或者 唯一索引查詢
            EXPLAIN SELECT * FROM users WHERE id=1;
          eq_ref
            某一列等于帶索引的列
            CREATE TABLE IF NOT EXISTS t1(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL, PRIMARY KEY(id))             ENGINE=InnoDB DEFAULT CHARSET=utf8;
            CREATE TABLE IF NOT EXISTS t2(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL, PRIMARY KEY(id))             ENGINE=InnoDB DEFAULT CHARSET=utf8;
            EXPALIN SELECT * FROM t1, t2 WHERE t1.id = t2.id;
            注意:當數據量足夠大時,才會出現此連接類型。
          ref
            使用普通索引進行查詢
            SELECT * FROM users WHERE name = 'admin';
          ref_or_null
            通過普通索引檢索,并且會檢索null值
            EXPLAIN SELECT * FROM users WHERE name = 'amdin' or name = null;
          range
            范圍
            EXPLAIN SELECT * FROM users WHERE id<3;
          index
            跟all一樣,不過只會掃描索引.
            EXPLAIN SELECT id FROM users;
          all
            全表掃描
            EXPLAIN SELECT * FROM users;
      索引優化
        創建
        主鍵
          CREATE TABLE test(id INT PRIMATY KEY AUTO_INCREMENT,name VARCHAR(50));
          ALTER TABLE test ADD PRIMARY KEY(id);
        普通索引
          CREATE TABLE test(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50), INDEX name(name));
          ALTER TABLE test ADD INDEX name(name);
        唯一索引
          CREATE TABLE test(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50), UNIQUE name(name));
          ALTER TABLE test ADD UNIQUE name(name);
        刪除
        主鍵
          ALTER TABLE test MODIFY id INT(10);
          ALTER TABLE test DROP PRIMARY KEY;
        非主鍵
          ALTER TABLE test DROP INDEX name;
        查看
          SHOW INDEX FROM test;
          注意:索引,利弊,索引是一把雙刃劍。
    多機配置
      主從
        好處
          單向備份
          讀寫分離,提高效率
          原理


實驗
在主服務器上操作
1. 啟動binlog日志
vi /etc/my.cnf
2. 在文件中添加
log-bin=mysql-bin
server-id=101
3. 重啟mysql
service mysqld restart
4. 查看二進制日志是否開啟
show global variables like '%log%';
5. 在 主服務器上 授權
grant replication slave on *.* to 'zhang'@'192.168.103.102' identified by '123456';
6. 查看主機信息
show master status;
在從服務器上操作
1. 啟動binlog日志
vi /etc/my.cnf
2. 在文件中添加
log-bin=mysql-bin
server-id=102
3. 重啟mysql
service mysqld restart
4. 查看二進制日志是否開啟
show global variables like '%log%';
5. 在 從服務器上 連接
change master to master_host='192.168.103.101',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=263;
6. 啟動 sql 線程
show slave status\G;
start slave;
主主
好處
雙向備份
高可用
負載均衡
原理
兩臺機器互為主從
實驗
在主服務器上操作
1. 啟動binlog日志
vi /etc/my.cnf
2. 在文件中添加
log-bin=mysql-bin
server-id=101
replicate-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
auto-increment-increment=2
auto-increment-offset=1
3. 重啟 mysql
service mysqld restart
4. 以 101 為主,以 102 為從
grant replication slave on *.* to 'zhang'@'192.168.103.102' identified by '123456';
show master status;
change master to master_host='192.168.103.101',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
5. 查看 SQL線程
show slave status\G;
start slave;
在從服務器上操作
1. 啟動binlog日志
vi /etc/my.cnf
2. 在文件中添加
log-bin=mysql-bin
server-id=102
replicate-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
auto-increment-increment=2
auto-increment-offset=2
3. 重啟 mysql
service mysqld restart
4. 以 102 為主,以 101 為從
grant replication slave on *.* to 'zhang'@'192.168.103.101' identified by '123456';
show master status;
change master to master_host='192.168.103.102',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
5. 查看 SQL線程
show slave status\G;
start slave;
中文分詞。
sphinx。=> coreseek。
scws。

轉載于:https://www.cnblogs.com/peilanluo/p/6995176.html

總結

以上是生活随笔為你收集整理的【mysql】mysql优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。