设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] mysql简介-1

[复制链接]

尚未签到

发表于 2018-10-6 06:42:42 | 显示全部楼层 |阅读模式
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、.....
  

DSC0000.jpg


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>  
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>
  
mysql>>  

  
# 丢失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>>  

2.3、mysql压力测试工具
    我们使用 sysbench这个工具
  下载链接, https://downloads.mysql.com/source/sysbench-0.4.12.14.tar.gz">点击下载,下载版本为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   >  --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、存储引擎
DSC0001.jpg


3.1、myisam与innodb引擎的区别
DSC0002.jpg

  表空间
  innodb_data_file_path负责系统表空间的路径、初始化大小、自动扩展策略
  innodb_autoextend_increment 负责数据库自动扩展大小
DSC0003.jpg

  默认为10M,建议调整为1G
DSC0004.jpg

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

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


  • 独立表空间每个表都有自己的表空间,并且可以实现表空间的转移,不好的地方在于每个表文件都有.frm和.idb文件,如果单表增长过快就容易出现性能问题
  • 共享表空间的数据和文件放在一起方便管理;
  • 共享表空间无法在线回收空间,如果想要回收需要先将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二进制默认是关闭的,生产环境一定要开启
DSC0006.jpg

  my.cnf中添加 开启二进制日志,server_id在5.7中需要配置,否则启动会一直失败
  log_bin=mysql-bin
  server_id=111
DSC0007.jpg

  此时我们在数据中做的任何操作,在二进制日志中都能查询
DSC0008.jpg

  查看二进制日志大小,每重启一次它都会重新生成一个,或者触发了最大值
DSC0009.jpg

DSC00010.jpg


3.4、slow log(慢查询日志)
  慢查询日志,slow_query_log默认关闭,配置文件中更改一下
DSC00011.jpg

  慢查询,以及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
  

  第一部分
DSC00012.jpg

  

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

  第二部分
DSC00013.jpg

  

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

  第三部分
  具体的SQL语句的详细输出结果
DSC00014.jpg


3.5、碎片处理
  使用delete的时候,mysql并不会将真实数据删除,而只是将数据文件标识位删除,当有新数据写入时,Mysql会再次利用这些被删除的区域;
DSC00015.jpg

  碎片大小=数据总大小-空际表空间大小
  这里总数为1024 实际大小21, 不到3B
  清理碎片的两种方法

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


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));
  

DSC00017.jpg

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

[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分钟,像测试最好用存储过程
DSC00018.jpg

  无索引查询
  mysql> select * from te1 ;
DSC00019.jpg

  查看索引
DSC00020.jpg

  key:null表示没有索引
  合理添加索引三个 "经常"
  1) 经常被查询的列 ( 一般放在where后面)
  2) 经常用于表连接的列
  3) 经常排序分组的列(order by 或者group by 后面的字段)
  越靠近1说明索引效果越好
DSC00021.jpg

  联合索引:必须满足最左前缀原则,一般把选择性高的列放在前面,一条查询语句可以只使用索引中的一部分,但必须从最左侧开始;
  索引总结:优点
  1)提高数据检索效率
  2)提高聚合函数效率
  3)提高排序效率
  4)使用覆盖索引可以避免回表
  四个不要:
  1)选择性低的字符不要创建索引
  2)很少查询的列不要创建索引(项目初期就要确定好)
  3)大数据类型字段不要创建索引;
  4)尽量避免不要使用NULL,应该指定列为NOT NULL
  使用不要索引的情况
  1)通过索引扫描的行记录数超过全表的30%,优化器就不会走索引,而变成全表扫描;
  2)联合索引中,第一个查询条件不是最左索引列
  3)联合索引中,第一个索引列使用范围查询,只能使用到部分索引,有ICP出现范围是指(   < , = ,

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-612901-1-1.html 上篇帖子: MySQL运维常用的SQL语句 下篇帖子: mysql-libs的冲突
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表