mysql简介-1

MYSQL介绍

  MySQL一般特制完整的MySQLRDBMS,是一个开源的关系型数据库管理系统(Relational Database Management System),现在属于Oracle公司。随着MySQL功能的不断完善,性能不断提高,又有开源免费的优势,越来越多的企业选择使用MySQL,而放弃商用收费的Oracle,目前最新版为:5.8

MYSQL体系

mysql结构体系::分两层:mysql server层、存储引擎层
   mysql server层: 分两层:连接层、SQL层
        连接层: 
            通信协议:兼容性
            线程处理: 连接线程分配,一个线程对应一个逻辑CPU,并会在多个逻辑CPU之间进行切换
            用户名密码:用户密码判断,以及授权信息
        SQL层:权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划
    存储引擎层: MYisam、innodb、NDB、.....

mysql简介-1

1、MYSQL安装前配置

1.1、swap分区设置

  swappiness对swap分区有很大的影响性,它这有两个极限值 0:最大限度使用物理内存, 100:积极使用swap分区,这里建议不用swap分区或分配4G内存空间
cat /proc/sys/vm/swappiness

1.2、操作系统的限制

ulimit -a查看
# 最大打开文件个数,如果文件打开句柄超过1024就会报错
    open files                      (-n) 1024
# 使用最大的进程数,最大进程7279
    max user processes              (-u) 7279
可以编辑 /etc/security/limits.conf加入限制的内容
*    soft       noproc   65535
*    head       noproc   65535
*    soft       nofile   65535
*    head       nofile   65535
\# 修改完之后重启系统才会生效

1.3、mysql读取配置文件顺序

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cn

1.4、mysql启动选项

1、 defaults-file: 使用指定的配置文件
2、 defaults-extra-file: 除了读取默认的配置文件,还读取额外的配置文件
3、 no-defaults: 忽略所有的配置文件
如果一次性指定多个配置文件,则以最后一次读取的为准 

1.5、my.cnf配置

my.cnf 大部分来自腾讯MYSQL的优化配置

[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

auto_increment_increment=1
auto_increment_offset=1
back_log=210
character_set_server=UTF8
concurrent_insert=AUTO
connect_timeout=10
default_week_format=0
div_precision_increment=4
event_scheduler=OFF
group_concat_max_len=1024
innodb_adaptive_hash_index=ON
innodb_autoinc_lock_mode=1
innodb_concurrency_tickets=5000
innodb_flush_log_at_trx_commit=2
innodb_ft_max_token_size=84
innodb_ft_min_token_size=3
innodb_large_prefix=OFF
innodb_lock_wait_timeout=7200
innodb_max_dirty_pages_pct=75
innodb_old_blocks_pct=37
innodb_old_blocks_time=1000
innodb_open_files=1024
innodb_print_all_deadlocks=OFF
innodb_purge_batch_size=300
innodb_purge_threads=1
innodb_read_ahead_threshold=56
innodb_read_io_threads=12
innodb_rollback_on_timeout=OFF
innodb_stats_on_metadata=OFF
innodb_strict_mode=ON
innodb_table_locks=ON
innodb_thread_concurrency=0
innodb_thread_sleep_delay=10000
innodb_write_io_threads=12
interactive_timeout=3600
lock_wait_timeout=31536000
log_queries_not_using_indexes=OFF
long_query_time=10.000000
low_priority_updates=OFF
lower_case_table_names=0
max_allowed_packet=1073741824
max_connect_errors=999999999
max_connections=800
max_length_for_sort_data=1024
max_prepared_stmt_count=16382
max_user_connections=0
net_read_timeout=30
net_retry_count=10
net_write_timeout=60
open_files_limit=102400
query_alloc_block_size=8192
query_cache_limit=1048576
query_cache_size=0
query_cache_type=OFF
query_prealloc_size=8192
slow_launch_time=2
sql_mode=NO_ENGINE_SUBSTITUTION
sync_binlog=0
table_definition_cache=768
table_open_cache=512
tmp_table_size=209715200
wait_timeout=3600
[mysqld_safe]
log-error=/data/mysql/mariadb.log
pid-file=/data/mysql/mariadb.pid

2、安装

mysql 5.6可以直接用mysql_install_db安装这里就不在讲解

2.1、MYSQL5.7安装

  安装前需了解:5.7安装初始化已经废弃了mysql_install_db这个命令

[root@do3 local]# cd /usr/local/
# 创建mysql用户
[root@do3 local]# useradd -u 3010 mysql -s /sbin/nologin
[root@do3 local]# mkdir -p /data/mysql
# 我们直接使用mysql二进制文件安装
[root@do3 local]# tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 
# 使用软链的方式,方便下次升级
[root@do3 local]# ln -sv mysql-5.7.22-linux-glibc2.12-x86_64 mysql
"mysql" -> "mysql-5.7.22-linux-glibc2.12-x86_64"
# 设置权限
[root@do3 local]# chown mysql.mysql mysql-5.7.22-linux-glibc2.12-x86_64 -R
[root@do3 local]# chown mysql.mysql /data/mysql/ -R
[root@do3 local]# cd mysql/bin
# 增加环境变量
[root@do3 mysql]# echo "export PATH=${PWD}:\$PATH" > /etc/profile.d/mysql.sh
[root@do3 mysql]# source !$
# 这里很重要,初始化mysql安装
[root@do3 mysql]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
2018-04-27T12:05:57.483766Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-04-27T12:05:57.483806Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2018-04-27T12:05:57.486165Z 0 [Warning] InnoDB: Using innodb_large_prefix is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html
2018-04-27T12:05:59.175629Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-04-27T12:05:59.494640Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-04-27T12:05:59.546806Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 59289cc1-4a13-11e8-9261-0050568a0453.
2018-04-27T12:05:59.579060Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-04-27T12:05:59.579540Z 1 [Note] A temporary password is generated for root@localhost: SdqwoGENy8+k

# 增加一个systemv风格的启动脚本
[root@do3 bin]# cd ..
[root@do3 mysql]# vim support-files/mysql.server
修改这两行
    basedir=/usr/local/mysql
    datadir=/data/mysql

[root@do3 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@do3 mysql]# chmod +x !$
[root@do3 mysql]# mkdir /var/lib/mysql
[root@do3 mysql]# chown mysql.mysql /var/lib/mysql/ -R

# 启动服务
[root@do3 mysql]# service mysqld start
Starting MySQL.Logging to '/data/mysql/mariadb.log'.
 SUCCESS! 

2.2、MYSQL初始密码设置

# mysql 初始密码会在init的时候就直接设置 也可以初始化之后查看error.log文件
[root@do3 mysql]# mysql -uroot -p
Enter password:   SdqwoGENy8+k
# 进入之后第一次是需要你修改默认密码的,强制性要求
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter  user 'root'@'localhost' identified by 'xiong123';

# 丢失root密码设置
配置文件中新增加一行  skip-grant-tables=1
或者,直接跳过权限,这样也能直接修改密码
[root@do3 mysql]# mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &

有可能会提示这样的错误
    ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
    解决: mysql> flush privileges; 
           mysql> alter user 'root'@'localhost' identified by 'xiong123';

2.3、mysql压力测试工具

  我们使用 sysbench这个工具
下载链接, 点击下载,下载版本为0.4.12.14

2.3.1、sysbench简介

  sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下操作都将以支持MySQL数据库为例进行

2.3.2、安装三部曲

1、解压 tar xf 
2、进入目录 ./configure --prefix=/usr/local/sysbench --with-mysql=/usr/local/mysql --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib/
3、make && make install

# 增加环境变量
[root@do3 bin]# echo "export PATH=/usr/local/sysbench/bin:$PATH" > /etc/profile.d/sysbench.sh
[root@do3 bin]#  source !$

安装时可能会出现
    Invalid configuration `x86_64-unknown-linux-': machine `x86_64-unknown-linux' not recognized
解决:yum -y install gcc gcc-c++ automake

# 查看帮助信息,发现缺少一个包
[root@do3 sysbench]# sysbench --help
sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory
解决办法 : ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20

2.3.3、主要参数

  --num-threads=N             number of threads to use [1]  使用最大线程
  --max-requests=N            limit for total number of requests [10000] 限制最大请求数
  --max-time=N                limit for total execution time in seconds [0] 限制最大执行时间
  --forced-shutdown=STRING    amount of time to wait after --max-time before forcing shutdown [off]  挂载多长时间然后根据在多长时间之后强制关闭
  --thread-stack-size=SIZE    size of stack per thread [32K]  线程堆栈大小 默认32K
  --init-rng=[on|off]         initialize random number generator [off]  初始化随机数发生器 默认关闭
  --test=STRING               名称

Compiled-in tests:
  fileio - File I/O test     IO测试
  cpu - CPU performance test   CPU测试
  memory - Memory functions speed test   内存测试
  threads - Threads subsystem performance test  线程
  mutex - Mutex performance test  测试互斥性能
  oltp - OLTP test 测试OLTP

oltp介绍,有兴趣的可以看看

2.3.4、Sysbench的测试主要包括以下几个方面:

   1、磁盘io性能
   2、cpu性能
   3、内存分配及传输速度
   4、POSIX线程性能
   5、调度程序性能
   6、数据库性能(OLTP基准测试).

2.3.5 对磁盘IO性能的测试

初始化一个fileio文件
[root@do3 sysbench]# sysbench --test=fileio --file-num=16 --file-total-size=1G prepare
sysbench 0.4.12.10:  multi-threaded system evaluation benchmark

16 files, 65536Kb each, 1024Mb total
Creating files for the test...
Extra file open flags: 0
Creating file test_file.0
.....
Creating file test_file.15
1073741824 bytes written in 18.18 seconds (56.33 MB/sec).

测试读取速度 
[root@do3 sysbench]# sysbench --test=fileio --file-total-size=1G --file-test-mode=rndrd --max-time=180 --max-requests=100000000 --num-threads=16 --init-rng=on --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run

180秒读了305M,每秒1M的速度,真是慢的掉渣啊
Operations performed:  19577 reads, 0 writes, 0 Other = 19577 Total
Read 305.89Mb  Written 0b  Total transferred 305.89Mb  (1.6991Mb/sec)
  108.74 Requests/sec executed

General statistics:
    total time:                          180.0351s  
    total number of events:              19577
    total time taken by event execution: 2878.3172
    response time:
         min:                                  5.22ms   最小
         avg:                                147.03ms  平均
         max:                                927.10ms 最大
         approx.  95 percentile:             333.84ms

Threads fairness:
    events (avg/stddev):           1223.5625/47.61  事件数
    execution time (avg/stddev):   179.8948/0.09

测试完之后删除
[root@do3 sysbench]# sysbench --test=fileio --file-num=16 --file-total-size=1G cleanup
sysbench 0.4.12.10:  multi-threaded system evaluation benchmark

Removing test files...

2.3.6、测试CPU

计算素数的时间:   不知道什么东东, 反正这值越少越好了
来自百度的解释 素数:在大于1的整数中,只能被1和这个数本身整除的数,如2,3,5,7,11。也叫质数。
[root@do3 sysbench]#   sysbench  --test=cpu  --cpu-max-prime=20000 run

General statistics:
    total time:                          17.6310s
    total number of events:              10000     2W个数有一万个质数?
    total time taken by event execution: 17.6273
    response time:
         min:                                  1.67ms     
         avg:                                  1.76ms
         max:                                  2.83ms
         approx.  95 percentile:               1.80ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   17.6273/0.00

2.3.6、OLTP的基准测试

生成一个test的表 构建100万行数据,也就是准备阶段,注意需要先在数据库中创建test的数据库
sysbench --test=oltp  --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password='xiong123' prepare
sysbench 0.4.12.10:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
Creating table 'sbtest'...
Creating 1000000 records in table 'sbtest'...

8个线程只读模式持续时间60秒,注意帐号密码
sysbench --test=oltp  --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --mysql-password='xiong123' --max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run

OLTP test statistics:
    queries performed:
        read:                            1443918     读速度
        write:                           0
        other:                           206274
        total:                           1650192
    transactions:                        103137 (1718.88 per sec.)  每秒事务 1718个
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 1443918 (24064.32 per sec.)    
    other operations:                    206274 (3437.76 per sec.)

General statistics:
    total time:                          60.0024s
    total number of events:              103137
    total time taken by event execution: 479.6422
    response time:
         min:                                  1.05ms
         avg:                                  4.65ms
         max:                                767.15ms
         approx.  95 percentile:               5.46ms

Threads fairness:
    events (avg/stddev):           12892.1250/77.37
    execution time (avg/stddev):   59.9553/0.00

3、存储引擎

mysql简介-1

3.1、myisam与innodb引擎的区别

mysql简介-1

表空间
innodb_data_file_path负责系统表空间的路径、初始化大小、自动扩展策略
innodb_autoextend_increment 负责数据库自动扩展大小
mysql简介-1

默认为10M,建议调整为1G
mysql简介-1

独立表空间
设置参数 innodb_file_per_table=1 # 5.7中默认开启
每个独立表空间存储对应B+树数据、索引、和插入缓冲等信息 .frm文件中,其它的还是在.idb中
mysql简介-1

共享表空间与独立表空间的区别

  1. 独立表空间每个表都有自己的表空间,并且可以实现表空间的转移,不好的地方在于每个表文件都有.frm和.idb文件,如果单表增长过快就容易出现性能问题
  2. 共享表空间的数据和文件放在一起方便管理;
  3. 共享表空间无法在线回收空间,如果想要回收需要先将Innodb表中数据备份,删除原表,然后再把数据导回到原表结构中一样的新表,特别统计分析和日志系统不太适合用共享表空间;
    综合考虑,独立表空间的效率,性能比共享表空间会更高一点,目前默认使用的就是独立表空间;

3.2、redo log

  redo log 又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来,断电之后 innodb存储引擎会使用重做日志恢复到掉电之前的状态,以此来保证数据的完整性。
  redo log至少有两个文件,redo log至少有两个文件以 Ib_logfile(0-N)命名,redo log写的方式是顺序写、循环写,当第一个写满了就写第二个,写满会产生切换操作,并执行checkpoing,触发脏页的刷新。

1) redo log通过 innodb_flush_log_at_trx_commint参数来控制,三个值0、1、2
0:每隔一秒会将redo log buffer写入redo log文件,同时进行刷盘操作,保证数据确实已经写入磁盘,每次事务提交并不会触发redo log thread将日志缓冲中的数据写入redo log文件
1:每次提交,都会触发redo log thread将日志缓冲的数据写入文件,并flush到磁盘,该设置是最安全的模式,保证数据库在主机断电,OS下不会丢失任务提交的证据
2:每次事务提交时,都会把redo log buffer的数据写入redo log文件,不会同时刷新到磁盘
三种模式下:

0:性能最好,但不安全,进程崩溃会导致丢失一秒的数据
1:安全性最高,但数据性能是最慢
2:介与两者中间     默认就是2   innodb_flush_log_at_trx_commit | 2     

2) master thread: 每秒进行刷新
3)redo log buffer: 使用超过一半的时候会触发刷新

3.3、binlog

功能应用于备份恢复和主从复制

  它通过sync_binlog参数来决定,sync_binlog=0,当事务提交后,Mysql不做fsync之类的的磁盘同步指令刷新 binlog_cache的信息到磁盘,而让系统自行决定,或者cache满了才同步到磁盘;
  为了确保安全性我们可以将sync_binlog设置为1, 但为了获得更好的性能,我们可以将sync_binlog设置为0;
  sync_binlog=0,innodb_flush_log_at_trx_commit=1这就是数据库的双1模式,可以确定数据库更加安全,但无法确保性能。 sync_binlog默认为 0

1) 主要功能
  一、可以完成主从复制功能,在主服务器上把所有修改数据的操作记录到binlog中,通过网络发送给从服务器,从而达到主从同步
  二、进行恢复操作,可以使用mysqlbinlog命令,实现基于时间点和位置的恢复操作
  三、mysql二进制默认是关闭的,生产环境一定要开启
mysql简介-1
my.cnf中添加 开启二进制日志,server_id在5.7中需要配置,否则启动会一直失败
log_bin=mysql-bin
server_id=111
mysql简介-1

此时我们在数据中做的任何操作,在二进制日志中都能查询
mysql简介-1

查看二进制日志大小,每重启一次它都会重新生成一个,或者触发了最大值
mysql简介-1
mysql简介-1

3.4、slow log(慢查询日志)

慢查询日志,slow_query_log默认关闭,配置文件中更改一下
mysql简介-1

慢查询,以及SQL未建索引的被记录。
slow_query_log=ON
log_queries_not_using_indexes=ON

慢日志可以更好的优化数据库的查询速度,当查询变慢时可以新加索引来提高速度;
日志分析可以使用mysqldumpslow查询,这里我们不用它,而是直接使用percona-toolkit工具,通过命令集合下的pt-query-digest来捕获线上的慢SQL语句,对其进行分析,下载地址,或点我下载 - 版本为:percona-toolkit-3.0.9-1.el7.x86_64.rpm

使用yum安装

[root@do3 tmp]# yum -y install https://www.percona.com/downloads/percona-toolkit/percona-toolkit-3.0.9/binary/redhat/7/x86_64/percona-toolkit-3.0.9-1.el7.x86_64.rpm
如果是.tar.gz的话 因为是二进制的 直接解压到bin目录直接就能用

linux下percona-toolkit工具包的安装和使用(超详细版)

这里主要使用 pt-query-digest,用法介绍

常用参数:
--create-review-table :当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。
--create-history-table:当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。
--filter :  对输入的慢查询按指定的字符串进行匹配过滤后再进行分析
--limit:限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是95%则按总响应时间占比从大到小排序,输出到总和达到95%位置截止。
--log=s :指定输出的日志文件
--history 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表
           中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。
--review:将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。
           当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。
--output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。
--since:从该指定日期开始分析。
--until:截止时间,配合—since可以分析一段时间内的慢查询。

查看最近24小时的慢日志
[root@do3 mysql]# pt-query-digest --since=24h /data/mysql/do3-slow.log > query.log

第一部分
mysql简介-1

 overall: 总共多少查询,上面是九条
 time range : 时间 
 unique:唯一查询时间,即对查询条件进行参数化后,总共有多少不同的查询,实验为9个
 total: 时间
 95%: 把所有值从小到大排列,位置位于95%的那个数一般最具有参与价值
 median:中位数,把所有值从小到大排列,位置位于中间的那个数

第二部分
mysql简介-1

response:响应时长
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句;
R/Call:平均每次执行的响应时间
item:查询对象,即具体的SQL语句

第三部分
具体的SQL语句的详细输出结果
mysql简介-1

3.5、碎片处理

使用delete的时候,mysql并不会将真实数据删除,而只是将数据文件标识位删除,当有新数据写入时,Mysql会再次利用这些被删除的区域;
mysql简介-1

碎片大小=数据总大小-空际表空间大小
这里总数为1024 实际大小21, 不到3B

清理碎片的两种方法
1) mysql> alter table version engine=innodb;
  这句话的作用就是重新整理一遍全表数据,整理之后的数据连续性好,全表扫描快,缺点是需要给全表加个写锁,需要经历的时间长
2) 备份原表数据,然后删掉,重新导入新表中,与原表结构一样
3)使用pt-online-schema-change
  在线整理表结构,收集碎片,给大表添加字段和索引,避免出现锁表导致阻塞读写的操作。

查看连接
mysql简介-1

3.6、索引

普通索引创建
alter table table_name add index index_name
或
create index index_name on table_name

测试索引效果
创建一个库
mysql> create database test;
mysql> use test;
mysql> create table te1(id int primary key not null auto_increment,name varchar(25));

mysql简介-1

插入测试数据 、不会存储过程直接用脚本

[root@do3 tmp]# cat tests.sh 
#!/bin/bash
#
MYSQL_USER=root
MYSQL_PASSWD=xiong123

echo `date`
for i in {1..50000};do
    user=`cat /dev/urandom | head -5 | md5sum | head -c 5`
    mysql -u${MYSQL_USER} -p${MYSQL_PASSWD} -h "192.168.9.224" -e "insert into test.te1 values (${i},'${user}')" &>/dev/null
done
echo `date`
echo "done"

5万条数据整了8分钟,像测试最好用存储过程
mysql简介-1

无索引查询
mysql> select * from te1 ;
mysql简介-1

查看索引
mysql简介-1
key:null表示没有索引

合理添加索引三个 "经常"
1) 经常被查询的列 ( 一般放在where后面)
2) 经常用于表连接的列
3) 经常排序分组的列(order by 或者group by 后面的字段)

越靠近1说明索引效果越好
mysql简介-1

联合索引:必须满足最左前缀原则,一般把选择性高的列放在前面,一条查询语句可以只使用索引中的一部分,但必须从最左侧开始;

索引总结:优点
1)提高数据检索效率
2)提高聚合函数效率
3)提高排序效率
4)使用覆盖索引可以避免回表

四个不要:
1)选择性低的字符不要创建索引
2)很少查询的列不要创建索引(项目初期就要确定好)
3)大数据类型字段不要创建索引;
4)尽量避免不要使用NULL,应该指定列为NOT NULL

使用不要索引的情况
1)通过索引扫描的行记录数超过全表的30%,优化器就不会走索引,而变成全表扫描;
2)联合索引中,第一个查询条件不是最左索引列
3)联合索引中,第一个索引列使用范围查询,只能使用到部分索引,有ICP出现范围是指( < , = , <=, BETWEEN and )
4)模糊查询条件列最左以通配符“%”开始 (可以考虑放到勃勃生机底里在面)
5)两个列索引,一个用于检索,一个用于排序;
6)查询字段上面有索引,但是使用了函数运算。

3.7、事务

事务务必遵循:一致性,完整性,持久性,原子性 四大特点

事务回退
mysql简介-1

事务提交
mysql简介-1

3.8、truncate和delete区别

1、回滚
一、delete 可以被回滚
mysql简介-1

二、truncate不能被回滚
mysql简介-1

2、自增
mysql简介-1

一、delete测试 依旧从最后一位自增
mysql简介-1

二、tuncate 从第一位开始自增
mysql简介-1

事务隔离级别,我这里就不在重复造轮子了;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章