mysql数据库理论与实战

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

数据库

 wKioL1nmkiXRAuBtAAJktmbrGTc711.png-wh_50

 

 wKiom1nmlOWgRcT7AAOiwOB1_mY658.png-wh_50

 wKioL1nmkjvyB0k5AAEDrbjnmxI435.png-wh_50

 wKioL1nmkkXyE7u4AALBHLEVfm8422.png-wh_50

 

 wKiom1nmlQSzVU0lAANP75WTjg0267.png-wh_50

wKiom1nmlRjweuk4AAFnTVINlAw158.png-wh_50

主流:互联网公司用mysql5.5

wKioL1nmkoPBTBOoAAGjwSaTeJA177.png-wh_50 

mysql单实例源码编译安装5.5.32

cd cmake-2.8.8

./configure

#CMake has bootstrapped.  Now run gmake.

gmake

gmake install

cd ../

 

1.3.2 依赖包

yum install ncurses-devel -y

 

1.4 开始安装mysql

1.4.1 创建用户和组

groupadd mysql

useradd mysql -s /sbin/nologin -M -g mysql

 

1.4.2 解压编译MySQL

tar zxf mysql-5.5.32.tar.gz

cd mysql-5.5.32

cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \

-DMYSQL_DATADIR=/application/mysql-5.5.32/data \

-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \

-DENABLED_LOCAL_INFILE=ON \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_FEDERATED_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \

-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \

-DWITH_FAST_MUTEXES=1 \

-DWITH_ZLIB=bundled \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_READLINE=1 \

-DWITH_EMBEDDED_SERVER=1 \

-DWITH_DEBUG=0

 

 

#-- Build files have been written to: /home/oldboy/tools/mysql-5.5.32

提示,编译时可配置的选项很多,具体可参考结尾附录或官方文档:

make

#[100%] Built target my_safe_process

make install

ln -s /application/mysql-5.5.32/ /application/mysql

如果上述操作未出现错误,则MySQL5.5.32软件cmake方式的安装就算成功了。

 

cp mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf

配置环境变量:

Echo export PATH=/application/mysql/bin:$PATH>>/etc/profile

Tail -1 /etc/profile

Source /etc/profile

Echo $PATH

 

初始化数据库

mkdir -p /application/mysql/data

chown -R mysql.mysql /application/mysql

chmod -R 1777 /tmp

/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql

 

cp /home/weipeng/tools/mysql-5.5.32/support-files/mysql.server /etc/init.d/mysqld

chmod +x /etc/init.d/mysqld

/etc/init.d/mysqld start

netstat -anptu |grep 3306

 wKioL1nmksPzoPIYAABnmpTV6Rw697.png-wh_50

 wKiom1nmlY-wVukfAALTswJrRko047.png-wh_50

 wKiom1nmlzXxtJu8AAOgY1RK2U4800.png-wh_50

 

 wKioL1nmlImhWXv-AANJG3wmbB0265.png-wh_50

 

mysql多实例的安装:

 pkill mysqld

rm -f /etc/init.d/mysqld 删除单实例  实际不删不会影响。

 mkdir -p /data/{3306,3307}/data

[root@mysql1 ~]# tree /data      

/data

├── 3306

   └── data

└── 3307

    └── data

 

directories, 0 files

wKioL1nmlKmQTABYAARpINDEwKM710.png-wh_50 

 

[root@mysql1 tools]# rz

rz waiting to receive.

Starting zmodem transfer.  Press Ctrl+C to cancel.

Transferring data.zip...

  100%       3 KB       3 KB/sec    00:00:01       0 Errors  

 

[root@mysql1 tools]# unzip data.zip

Archive:  data.zip

   creating: data/

   creating: data/3306/

  inflating: data/3306/my.cnf        

  inflating: data/3306/mysql         

   creating: data/3307/

  inflating: data/3307/my.cnf        

  inflating: data/3307/mysql         

[root@mysql1 tools]# cp data/3306/my.cnf /data/3306/

[root@mysql1 tools]# cp data/3307/my.cnf /data/3307/

wKiom1nml2mQGvaEAAFFM-moqT4624.png-wh_50 

mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 >/dev/null &

mysqld_safe --defaults-file=/data/3307/my.cnf 2>&1 >/dev/null &

 

mysqladmin -u root -pweipeng -S /data/3306/mysql.sock shutdown

mysqladmin -u root -pweipeng -S /data/3307/mysql.sock shutdown

或者用老男孩写的shell脚本启动多实例mysql

[root@mysql1 tools]# cd data

[root@mysql1 data]# ls

3306  3307

[root@mysql1 data]# cp 3306/mysql /data/3306

[root@mysql1 data]# cp 3307/mysql /data/3307

[root@mysql1 data]#

[root@mysql1 data]#

[root@mysql1 data]#

[root@mysql1 data]# tree /data/

/data/

├── 3306

   ├── data

   ├── my.cnf

   ├── mysql

   └── mysql_oldboy3306.err

└── 3307

    ├── data

    ├── my.cnf

    ├── mysql

└── mysql_oldboy3307.err

 

chown -R mysql.mysql /data

 

find /data/ -type f -name mysql|xargs ls -l

find /data/ -type f -name "mysql" |xargs ls -l

find /data/ -type f -name "mysql" |xargs chmod +x

 

初始化多实例数据库:

[root@mysql1 tools]# cd /application/mysql/scripts/

[root@mysql1 scripts]# ls

mysql_install_db

[root@mysql1 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql

 

[root@mysql1 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

 

然后启动各实例数据库:

[root@mysql1 scripts]# /data/3306/mysql start

Starting MySQL...

[root@mysql1 scripts]# /data/3307/mysql start

Starting MySQL...

 

查看是否启动:

Starting MySQL...

[root@mysql1 scripts]# netstat -lnptu|grep 330

tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      35831/mysqld        

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      35115/mysqld        

 

多实例更改密码:

mysqladmin -u root -S /data/3306/mysql.sock password weipeng

 

多实例登录mysql

[root@mysql1 3306]# mysql -S /data/3306/mysql.sock 指定sock才能登录

 

修改属主和权限:

find /data/ -type f -name "mysql" |xargs chmod 700

find /data/ -type f -name "mysql" |xargs chown root.root

 

多实例有密码后的登录:

mysql -S /data/3306/mysql.sock -u root -pweipeng

 

总结:先用mysql用户然后+x权限初始化数据库,然后修改用户为root,权限改为700,再登录。

 

vim里面的内容替换:跟sed有点想:%s#A#B#g,A换成B

 

wKioL1nmlNCDLouRAACnKgZtpuM051.png-wh_50 

 

优雅关闭mysql

1、mysqladmin -uroot -pweipeng shutdown

2、/etc/init.d/mysqld stop

 

想登录时不被看到明文密码直接在命令前加个空格即可,如果想删除某条hostory记录例如第二条,可以history -d 2

 

强制linux不记录敏感历史命令:

#HISTCONTROL=ignorespace

 

修改mysql提示符:

prompt \u@mysql \r:\m:\s->

 

有密码修改密码:

mysqladmin -u root -pweipeng password weikang

 

在数据库内部更新密码,适合密码丢了找回来:

update mysql.user set password=password(456) where user=root and host=localhost; --------password(456)此处是调用password函数叫明文密码456加密,否则明文的密码在mysql看来是不安全的不让登陆,更改无效。而且where条件必须加,否则容易把所有都改了。

 

在数据库内部还可以用如下方法,不适合密码丢了,只适合修改密码:

mysql> set password=password(weikang);

修改密码后都要刷新:flush privileges;

 

改密码后关闭mysql方式:mysqladmin -uroot -p新密码 shutdown

 wKiom1nml6_iIFzcAAGvitYR5TM486.png-wh_50

 wKioL1nmlQSRUa6BAAC4KqkyG4g795.png-wh_50

 

是大多数关系数据库管理系统所支持的工业标准。

DDLcreatedropalter

DML:数据操作语言、增删改

DCL:控制语言,grantrevokecommiteroback

 

mysql> create database oldboy;

Query OK, 1 row affected (0.00 sec)

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| oldboy             |

| performance_schema |

| test               |

+--------------------+

rows in set (0.03 sec

 

查看新建数据库创建过程:

mysql> show create database oldboy;

+----------+-----------------------------------------------------------------+

| Database | Create Database                                                 |

+----------+-----------------------------------------------------------------+

| oldboy   | CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+-----------------------------------------------------------------+

row in set (0.00 sec)

 

创建不同字符集数据库:

wKioL1nmlRrTagO3AAHGuUfS7Kg491.png-wh_50 

 

连接数据库:use weipeng

查看当前数据库:select database();

 

操作案例1,创建weikang用户(还可通过creategrant配合创建),对test库具备所有权限,允许从localhost主机登录管理数据库,密码是weikang

grant all privileges on test.* to weikang@localhost identified by weikang;

 

查看某用户的权限:

mysql> show grants for oldboy@localhost

    -> ;

+---------------------------------------------------------------------------------------------------------------+

| Grants for oldboy@localhost                                                                                   |

+---------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515' |

| GRANT ALL PRIVILEGES ON `test`.* TO 'oldboy'@'localhost'                                                      |

+---------------------------------------------------------------------------------------------------------------+

rows in set (0.00 sec)

 

另一种创建用户及授权的方法:

1mysql> create user oldgirl@localhost identified by 'oldgirl123';

Query OK, 0 rows affected (0.00 sec)

2、grant all on test.* to oldgirl@localhost;

 

远程授权及连接:

wKioL1nmlUmyg8hAAAB7qTRASlQ843.png-wh_50 

 wKiom1nmmAyhj7anAAAqCBHRLSE242.png-wh_50

或者create user test@10.1.1.0/255.255.255.0 identified by test,但不能为

create user test@10.1.1.0/24   identified by test

 

oracle里查看help方法:首先help index,它把需要帮助的主题目录列出来,然后比如选择show主题,就可以help show查看关系show的用法。

 

收回用户权限,一定要对上对应的用户权限的库:

wKiom1nmmFbim2M8AABbSZYVKKM453.png-wh_50如果是*.*,那是收不回权限的。


 wKioL1nmlavCOMc8AAPzK4WHyqM736.png-wh_50


建表的方法:

wKiom1nmmIDQ_FRdAABpeePUFTA660.png-wh_50 

案例:

 wKiom1nmmMGSB8UMAACa8z1eZjA234.png-wh_50wKiom1nmmNSz5o48AAEttWKAKao483.png-wh_50

 

wKioL1nmlkHDDV35AAHJqzqg9bc903.png-wh_50 

 

wKioL1nmllfTqfcVAAD8wMCjHsI780.png-wh_50ID自增,id主键,name为普通索引

 

 wKiom1nmmTKg8uakAABwvBPikr0298.png-wh_50

 

 wKioL1nmlobwDIjmAACQWTmKWfI591.png-wh_50

添加表的字段,

 wKiom1nmmVrBKp5YAAFReVDYknw957.png-wh_50

 wKiom1nmmWPgaocsAAB8aB1a0og032.png-wh_50

更改表名:

 wKioL1nmluThGjEeAAC7uilQgJw411.png-wh_50

wKioL1nmlvfwZ_uKAAF1Dbs7aws389.png-wh_50 

 wKiom1nmmcWQp0qFAAFNLcqo4Do404.png-wh_50

 wKioL1nmlxrTVTkGAADeSHg2DTU128.png-wh_50

mysqldump在备份数据库时最好加上-B参数,因为-B是在备份时也备份创建数据库的过程命令,这样在还原时就不用手工创建数据库,然后还原数据了,直接如下即可:

 wKioL1nml3KjeSQAAAGTm95d0Mo744.png-wh_50

 

 wKiom1nmmjSxd8K8AAIidEZjteA356.png-wh_50

 wKiom1nmmkPDFYrYAAEVoec4X_Q845.png-wh_50

 

master-date=1这个参数能够在从库恢复时从binlog日志哪个点开始恢复。

 

master-date=2这个参数能够在从库恢复时从binlog日志开始恢复。

 wKiom1nmmoGx-6_JAAK3QVfVcEE651.png-wh_50

 

 wKioL1nml9iTT2GPAAJmUsyCNQg197.png-wh_50

 

 wKiom1nmmpfQqexcAAFOSzsIzsk196.png-wh_50

 

source还原备份的数据库:

wKioL1nmmAGwjjBbAAEuGz9KE2A249.png-wh_50 

 

当没有-B备份数据库,还原时需要加数据库名,否则不成功:

wKiom1nmmtGTgxxJAAEQIYliiCg784.png-wh_50 


 wKiom1nmmxnjTdmeAAGUovvwcuM426.png-wh_50

 

 wKioL1nmmG-xd9DOAAHTUnMEfu8171.png-wh_50

 

wKiom1nmmznj1fBUAAK-FCHPkL4694.png-wh_50

查看binlog日志不能用cat方式查看,而要用mysqlbinlog来查看:

wKioL1nmmJ2B2FHmAAQfugBFxH8964.png-wh_50 

binlog日志提取想要的备份,比如只想把oldboy库提取出来,这么做的原因在于生产环境中有很多库,如果整个库恢复需要大量时间,而且没有破坏的数据库去恢复会被阻止,导致要恢复的也恢复不下去:

wKioL1nmmMuyqEpKAABrGx5-4UE811.png-wh_50 

 

指定位置点恢复,生产环境用的多:

wKiom1nmm4niX8sBAACP9WU1xqQ212.png-wh_50 

 

通过时间点恢复,生产环境用的少,因为时间相对模糊,容易出错:

wKiom1nmm5DylXf9AACifcFs-GY057.png-wh_50 

 

mysql里叫binlog,在my.cnf里叫log-bin

wKiom1nmm5mBuIO2AACle8lPOBY487.png-wh_50 

 

百度搜索mysql集群高可用架构方案演变---------老男孩主讲

 

mysql主从复制有利于数据库脚骨的健壮性、提升访问速度和易用性。

 

主从同步是异步,没有解决同步一致的义务,做不到数据一条不丢。用双写、一分钟日志解决。

 

主从读写分离:大多网站是读多写少。所以从库要做的内容比较多,一般集群。

 

企业双主的少,因为写的少,放两设备浪费,另外可用监控主,一旦发现问题,可切换备为主,主宕机不能写在有限的时间内也可忍受,读不能宕机:

wKioL1nmmQCg5s--AAGJluh8I0A598.png-wh_50 

 

主从同步原理图:

wKiom1nmm8DyBKR5AAL0JZHkIl8656.png-wh_50 

主从复制最重要的是主要打开binlog,在my.cnf里将log_bin那行注释去掉。

mysql里查看是否已开启binlog,从库binlog日志可开可不开,主的一定要开:

wKioL1nmmSWAdabrAAANfHQZ6k0430.png-wh_50 

在主mysql库上建立从库可复制logbin日志的用户及相关权限:

wKiom1nmm-SyLku8AAGuq8dFmuU960.png-wh_50 

mysql> grant replication slave on *.* to 'rep'@'192.168.247.%' identified by 'oldboy123';

Query OK, 0 rows affected (0.01 sec)

 

mysql> flush privileges;           记得刷新

Query OK, 0 rows affected (0.00 sec)

 

然后备份数据库:

1、先锁表,不让写了,然后查看binlog点:

wKiom1nmnDGQ-nX3AAD2P8yQscg999.png-wh_50 

2、备份数据:

wKioL1nmmYbhxUbFAABjhI4gIOE590.png-wh_50 

3、vi查看/opt/rep.sql,搜索CHANGE,可查看到位置点是否和show master status的一样,一样说明备份正确:

wKiom1nmnESzYX4gAAAhpqoL55c509.png-wh_50 

4、主库上解除锁表提供对外服务:

wKiom1nmnE2zcv_gAADM2RDIFDU304.png-wh_50 

5、在从库上将备份的数据库导入:

[root@mysql1 ~]# mysql -uroot -pweipeng -S /data/3307/mysql.sock </opt/rep.sql

 

6、在从库进入mysql执行以下配置,打开changlog,主从成功后会在从库的主目录下生成relay-binlog日志。

CHANGE MASTER TO

    MASTER_HOST='192.168.247.78',

    MASTER_PORT=3306,

    MASTER_USER='rep',

    MASTER_PASSWORD='oldboy123',

    MASTER_LOG_FILE='mysql-bin.000005',

    MASTER_LOG_POS=338;

7、在从库查看是否有master内容更新,cat /data/3307/data/master.info

[root@mysql1 data]# cat master.info

18

mysql-bin.000005

338

192.168.247.78

rep

oldboy123

3306

60

 

8、打开从库更新日志开关,进入mysql

start slave;

9、查看从库状态,如果显示两个进程都yes那么即为主从成功:

wKioL1nmmbXgaWzxAAAzlkfBRJg403.png-wh_50 

10、在主库创建新数据库,查看备库是否同步更新:

 wKioL1nmmk_iDLBHAAAcdQJQNIU477.png-wh_50

 wKioL1nmmlvAnQeBAAOU4bqIRsI927.png-wh_50

 

 wKioL1nmmmSzjvRQAAID1F2MlQI348.png-wh_50

 wKiom1nmnSWDvaoZAAOW1p5_9qs955.png-wh_50

 wKiom1nmnTPTRRclAALEEX3Hvg8115.png-wh_50

 wKiom1nmnU6jstidAAJgSejjI9w323.png-wh_50

3)真正的企业授权方案,只同步数据,不同步授权用户:

 wKioL1nmmsGgjkyfAAGyVVjWJMw673.png-wh_50

 wKiom1nmnX_SY4VqAABgXq0xs0M006.png-wh_50

 

read-only的方式让从库不能写,my.cnf里的mysqld模块里加上read-only即可:

 wKiom1nmndbjLK7xAAE4-nsU4zA192.png-wh_50

wKioL1nmmwHzkQuzAAEmBYz0MYs691.png-wh_50

 

当在主从数据库不一致时,会出现同步出错,其中已解决办法如下:

 wKiom1nmnfvjD39JAAGUNWkM4HI958.png-wh_50

当数据库连接慢时,忽略名字解析:

 wKioL1nmm07ialGMAACJvLWQJrA759.png-wh_50


从库开启binlog原因及方法:

 wKioL1nmm1fzGo9XAADD552nGWg125.png-wh_50

开启方法如下,缺一不可

log-bin = /data/3307/mysql-bin

log-slave-updates

expire_logs_days = 7 保留几天,不要用find查找来删除,可能会产生问题。

 

查看以上有没生效到主目录下,看有没有mysql-bin.index产生即可。

 

异步复制(Asynchronous replication):

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

 

全同步复制(Fully synchronous replication):

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

 

半同步复制(Semisynchronous replication):

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用

 

当主库出现问题时,会在从库中选择myster.info容量或POS最大的那个作为新的主库,因为它的内容最新,需要的bin-log日志也少些容易恢复些,另外如果整个主从同步是半同步机制,那么半同步里的从主机即刻接替服务:

 wKioL1nmm73xHG9PAAHudi2DfiI895.png-wh_50

 wKiom1nmnoGCSpiyAACUMJdzMBY068.png-wh_50

 wKiom1nmno7R9upuAACVn2a37UQ104.png-wh_50

 wKioL1nmm-KRdw1KAAKlwJk67ME600.png-wh_50

 wKiom1nmnr_Dh5xoAAODrpBVW4M732.png-wh_50

 wKioL1nmnB2wN6f2AAQBaEjAeJQ987.png-wh_50

 wKiom1nmntzCsalYAALO5ZBh-Jo528.png-wh_50


mysql增量恢复流程总结,最好就是停住主库:

 wKioL1nmnFyx75eVAAHzcQZL2TY666.png-wh_50

 wKioL1nmnGXDEeYDAAI5UHzKADk083.png-wh_50

  wKiom1nmnyax3MBNAAGYLUkcr48059.png-wh_50

 

mysql的日志及种类:

wKiom1nmnzuhEtBZAAKr-otsqYM280.png-wh_50 

错误日志:在my.cnf里的mysqld_safe里配置

二进制日志:就是binlog日志

查询日志:是记录数据库连接和操作命令的相关记录,包括创建数据库创建表都属于查询日志,开关在mysql内部打开,set global general_log = ON;如下:

wKioL1nmnJWQu60OAAFZgFZfd7o692.png-wh_50 

 

慢查询日志,在my.cnf,值查询查过设定时间的就会有日志记录,设置方式如下:

long_query_time = 1

log-slow-queries = /data/3306/slow.log

log_queries_not_using_indexes  .......没使用索引的才记录进去,缩小范围

 

binlog日志的三种模式

1、statement level模式

 wKiom1nmn4fg1gYiAARfvjK3p2I234.png-wh_50

2、row level模式

 wKiom1nmn5HS52j-AASWMzETpe0330.png-wh_50

3、mixed模式

 wKiom1nmn5vBur6aAAH4gn2zDGM159.png-wh_50

 

查看mysql数据库现在的binlog模式:

show variables like %binlog_format%;

修改binlog模式,可在my.cnf里或mysql库在线升级:

wKioL1nmnQiixVddAABO0jHoZ9A552.png-wh_50 wKioL1nmnRnQuK9WAABP___OvFE671.png-wh_50

 

刷新binlog日志:

mysqladmin -uroot -pweipeng -S /data/3307/mysql.sock  flush-logs

 

通过mysqlbinlog查看rows级日志:

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000016

 wKiom1nmn_WwBQ5fAAT8RU7HbfA583.png-wh_50

 

 wKioL1nmnUug4yW3AARcFCUpUDQ506.png-wh_50

wKioL1nmnVvAW6bRAAQLYghrW94965.png-wh_50 

 

InnoDBMyISAN占内存,但现在内存都很多,innodb这个缺点已不是问题。

wKiom1nmoC3x6NihAAIPwOdeMiY269.png-wh_50 

 

事务:简单的说,事务是指逻辑上的一组sql语句操作,组成这组操作的各个sql语句,执行时要么全成功要么全失败。

 wKioL1nmnZqwIgAeAAP67BjW9bw415.png-wh_50

 wKioL1nmnaLCiqkoAAIzFQhHlQY399.png-wh_50

myisam引擎的适合场所是不支持事务,读多写少的业务。

 wKiom1nmoIKyBMBpAAUpuu67xTY888.png-wh_50

 

 wKioL1nmndXTvOHZAAP-E6ohBH4983.png-wh_50

 wKiom1nmoJTjEnQQAAGzFFat36o713.png-wh_50

 

myisam在磁盘上有三个文件,如下:

 wKiom1nmoLmjhBpGAAB34YERmUo137.png-wh_50

innodb在磁盘只有一个文件,如下:

wKioL1nmng2xAdGuAAAC-Q9t4R8848.png-wh_50 

 wKioL1nmnjTypBcoAAK_oRhbgJ0730.png-wh_50

 wKiom1nmoPPDXxnPAALjhXLBQvQ829.png-wh_50

 wKioL1nmnkeyt3azAAPkg9Z1OW0990.png-wh_50

 

查看数据库共有多少种引擎:show engines\G

 

修改表的引擎类型:

wKiom1nmoTWy3rznAAB7R-Cpkfs365.png-wh_50

wKioL1nmnoyjvx36AAJiie7Oe0s363.png-wh_50

网站慢可能出现慢查询,可采用如下命令,间隔两秒再看下,如果同一结果还在里面,那么基本可确认该语句即为慢查询:

mysql> show full processlist;

然后查看是否有建索引:

 wKiom1nmoXnCH4FGAADvbiHY91M540.png-wh_50

 wKioL1nmnszy4k-lAABZyyNkc0o684.png-wh_50

 

不重复值最多的上面创建索引,where后有=的走索引效率最高:

create index d_a_p ad_oldboy_detail(dateline,ader(20),pos(20));

wKiom1nmodSTzOv0AAH2inDXLJk108.png-wh_50 

  wKiom1nmod6TBZSgAAQ3vu1ds8g863.png-wh_50

数据库不适合做搜索,有相关软件适合做,比如SphinxXapian(大公司会自己开发类似百度的小规模内部搜索引擎):

 

cpu高 strace 死循环


wKioL1nmnzmhCgQZAAKhfHyKK_I156.png-wh_50

本文转自  流颗星  51CTO博客,原文链接:http://blog.51cto.com/liukexing/1973401


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
数据库
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
20 0
|
2月前
|
存储 SQL 关系型数据库
MySQL - 深入理解锁机制和实战场景
MySQL - 深入理解锁机制和实战场景
|
3月前
|
关系型数据库 MySQL
电子好书发您分享《MySQL MGR 8.0高可用实战》
电子好书发您分享《MySQL MGR 8.0高可用实战》 电子好书发您分享《MySQL MGR 8.0高可用实战》
90 1
|
3月前
|
存储 关系型数据库 MySQL
由浅入深:数据库编程概念与实战
由浅入深:数据库编程概念与实战
151 1
|
3月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
133 0
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
94 0
|
4天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
9天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
28 5
|
11天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
16 1
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
29 0