mysql多实例

1 数据库系列课程 2 MySQL 3 1.版本介绍和选择 4 2.安装 5 3.体系结构 6 4.SQL 7 5.索引及执行计划 8 6.存储引擎 9 7.日志 10 8.备份恢复 11 9.主从 12 10.高可用架构 13 11.高性能架构 14 15 Redis 16 1.安装配置 17 2.数据类型 18 3.事务 19 4.持久化 20 5.高可用架构 21 6.分布式 22 7.API 23 24 MongoDB 25 1.安装配置 26 2.用户管理 27 3.CRUD 28 4.Replication set复制集 29 5.Sharding Cluster 分布式分片集群 30 31 Oracle课程(看时间) 32 33 ================================= 34 1.MySQL 版本 35 36 Oracle MySQL 8.0 37 MariaDB 38 PerconaDB 39 40 主流版本 41 mysql 5.6 5.6.36 5.38 5.6.40 42 mysql 5.7 5.7.18 5.7.20 5.7.22 43 44 企业版本选择: 6-12月之间的GA 45 46 2.MySQL的体系结构 47 2.1 MySQL C/S结构 48 两种链接方法: TCP/IP (远程,本地),SOCKET(本地) 49 50 mysql -uroot -poldboy123 -h 10.0.0.200 -P3306 51 mysql -uroot -poldboy123 -S /tmp/mysql.sock 52 53 2.2 MySQL实例 54 实例=mysqld+内存结构 55 MySQL实例======> mysqld(董事长)---->master thread(经理)---->N Thread(员工) ------>内存结构(办公区) 56 57 2.3 mysqld三层结构 58 59 连接层 60 1.提供连接协议(TCP ,Socket) 61 2.用户验证 62 3.提供专用链接线程 63 64 SQL层 65 1.接收上层的命令 66 2.语法检测 67 3.语义(SQL类型),权限 68 SQL类型:DDL数据定义语言 DCL数据控制语言 DML数据操作语言 DQL数据查询 69 4.专用解析器解析SQL,解析成多种执行计划 70 5.优化器:帮我们选择一个代价最低的执行计划(cpu,IO,MEM) 71 6.执行器:按照优化器的选择,执行SQL语句,得出获取数据方法 72 7.查询缓存:默认是关闭的. 一般会使用redis产品替代 Tair 73 8.记录日志:二进制日志 74 75 存储引擎层 76 按照SQL层结论,找相应数据,结构化成表的形式 77 78 79 3. MySQL的逻辑结构 80 81 库(schema):存储表的地方(库名,属性) 82 表(Table):二维表 83 84 元数据 85 表名字 86 表的属性(表的大小,权限,存储引擎,字符集等) 87 列:列名字,列属性(数据类型,约束,其他定义) 88 ============================================== 89 记录:数据行 90 ============================================== 91 4.SQL 语句(SQL92) 92 4.1 SQL 种类 93 DDL数据定义语言 94 DCL数据控制语言 95 DML数据操作语言 96 DQL数据查询语言 97 98 4.2 SQL语句的操作对象 99 100 101 102 4.3 不同分类语句作用 103 104 DDL : 105 106 CREATE DATABASE 107 DROP DATABASE 108 ALTER DATABSE 109 110 SQL语句规范第一条: 111 CREATE DATABASE oldboy CHARSET utf8mb4; 112 1.关键字大写(非必须),字面量小写(必须) 113 2.库名字,只能是小写,不能有数字开头,不能是预留关键字 114 3.库名字必须和业务名有关,例如his_user; 115 4.必须加字符集. 116 117 118 CREATE TABLE 119 DROP TABLE 120 ALTER TABLE 121 122 CREATE TABLE t1 ( 123 id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT \'用户ID\', 124 sname VARCHAR(20) NOT NULL COMMENT \'用户姓名\', 125 gender ENUM(\'f\',\'m\',\'u\') NOT NULL DEFAULT \'u\' COMMENT \'用户性别\', 126 telnum CHAR(11) NOT NULL UNIQUE COMMENT \'手机号\', 127 tmdate DATETIME NOT NULL DEFAULT NOW() COMMENT \'录入时间\' 128 )ENGINE INNODB CHARSET utf8mb4; 129 130 SQL语句规范第二条: 131 1.关键字大写(非必须),字面量小写(必须) 132 2.表名必须小写,不能有数字开头,不能是预留关键字 133 3.表名字必须和业务名有关 134 4.必须加存储引擎和字符集 135 5.适合的数据类型 136 6.必须要有主键 137 7.尽量非空选项 138 8.字段唯一性 139 9.必须加注释 140 10.避免使用外键 141 11.建立合理的索引 142 143 DCL: 144 grant 145 revoke 146 lock 147 148 DML : 149 insert 150 update 151 delete 152 153 SQL语句规范第三条: 154 1.insert语句按批量插入数据 155 2.update必须加where条件 156 3.delete尽量替换为update 157 4.如果有清空全表需求,不要用delete,推荐使用truncate 158 159 DQL : 160 select 161 show 162 163 SQL语句规范第四条: 164 1. select语句避免使用 select * from t1; ----> select id,name from t1; 165 2. select语句尽量加等值的where条件.例如 select * from t1 where id=20; 166 3. select 语句对于范围查询,例如 ;select * from t1 where id>200; 尽量添加limit或者 id>200 and id<300 union all id>300 and id<400 167 4. select 的where 条件 不要使用 <> like \'%name\' not in not exist 168 5. 不要出现3表以上的表连接,避免子查询 169 6. where条件中不要出现函数操作. 170 171 172 =============== 173 5. MySQL 5.7 初始化配置 174 175 5.1 初始化数据: 176 /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=http://www.likecs.com/opt/mysql/data --basedir=http://www.likecs.com/opt/mysql 177 178 5.2 配置文件 179 vim /etc/my.cnf 180 [mysqld] 181 basedir=http://www.likecs.com/usr/local/mysql 182 datadir=http://www.likecs.com/usr/local/mysql/mydata 183 socket=http://www.likecs.com/tmp/mysql.sock 184 log_error=http://www.likecs.com/var/log/mysql.log 185 user=mysql 186 port=6606 187 [mysql] 188 socket=http://www.likecs.com/tmp/mysql.sock 189 190 191 作用: 192 1.影响服务端的启动 193 标签: [mysqld] [mysqld_safe] [server] ... 194 [mysqld] 195 basedir=http://www.likecs.com/opt/mysql 196 datadir=http://www.likecs.com/opt/mysql/data 197 user=mysql 198 socket=http://www.likecs.com/tmp/mysql.sock 199 port=3306 200 server_id=6 201 202 2.影响客户端连接 203 标签: [client] [mysql] [mysqldump] .... 204 [mysql] 205 socket=http://www.likecs.com/tmp/mysql.sock 206 207 208 209 ======================= 210 5.3 多实例(3307 3308 3309) 211 212 5.3.1 创建相关目录 213 mkdir -p /data/330{7..9}/data 214 215 5.3.2 创建配置文件 216 cat>> /data/3307/my.cnf<<EOF 217 [mysqld] 218 basedir=http://www.likecs.com/opt/mysql 219 datadir=http://www.likecs.com/data/3307/data 220 user=mysql 221 socket=http://www.likecs.com/data/3307/mysql.sock 222 port=3307 223 server_id=3307 224 EOF 225 226 cp /data/3307/my.cnf /data/3308 227 cp /data/3307/my.cnf /data/3309 228 229 sed -i \'s#3307#3308#g\' /data/3308/my.cnf 230 sed -i \'s#3307#3309#g\' /data/3309/my.cnf 231 232 233 5.3.3 初始化数据 234 mysqld --initialize-insecure --user=mysql --datadir=http://www.likecs.com/data/3307/data --basedir=http://www.likecs.com/opt/mysql 235 mysqld --initialize-insecure --user=mysql --datadir=http://www.likecs.com/data/3308/data --basedir=http://www.likecs.com/opt/mysql 236 mysqld --initialize-insecure --user=mysql --datadir=http://www.likecs.com/data/3309/data --basedir=http://www.likecs.com/opt/mysql 237 238 239 5.3.4 启动多实例 240 chown -R mysql.mysql /data/* 241 mysqld_safe --defaults-file=http://www.likecs.com/data/3307/my.cnf & 242 mysqld_safe --defaults-file=http://www.likecs.com/data/3308/my.cnf & 243 mysqld_safe --defaults-file=http://www.likecs.com/data/3309/my.cnf & 244 245 246 5.3.5 测试 247 netstat -lnp|grep 330 248 249 mysql -S /data/3307/mysql.sock 250 mysql -S /data/3308/mysql.sock 251 mysql -S /data/3309/mysql.sock 252 253 5.3.6 systemd管理多实例 254 255 cat >> /etc/systemd/system/mysqld3307.service <<EOF 256 [Unit] 257 Description=MySQL Server 258 Documentation=man:mysqld(8) 259 Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html 260 After=network.target 261 After=syslog.target 262 [Install] 263 WantedBy=multi-user.target 264 [Service] 265 User=mysql 266 Group=mysql 267 ExecStart=http://www.likecs.com/opt/mysql/bin/mysqld --defaults-file=http://www.likecs.com/data/3307/my.cnf 268 LimitNOFILE = 5000 269 EOF 270 cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3308.service 271 cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3309.service 272 sed -i \'s#3307#3308#g\' /etc/systemd/system/mysqld3308.service 273 sed -i \'s#3307#3309#g\' /etc/systemd/system/mysqld3309.service 274 275 276 systemctl start mysqld3307 277 systemctl start mysqld3308 278 systemctl start mysqld3309 279 netstat -lnp|grep 330 280 systemctl stop mysqld3309 281 systemctl stop mysqld3308 282 systemctl stop mysqld3307 283 systemctl enable mysqld3307 284 systemctl enable mysqld3308 285 systemctl enable mysqld3309 286 287 288 6.忘记密码处理 289 290 mysqladmin -uroot -p password 123 291 292 select user,authentication_string,host from mysql.user; 293 294 1.停数据库 295 /etc/init.d/mysqld stop 296 2.启动数据库为无密码验证模式 297 mysqld_safe --skip-grant-tables --skip-networking & 298 update mysql.user set authentication_string=PASSWORD(\'456\') where user=\'root\' and host=\'localhost\'; 299 /etc/init.d/mysqld restart 300 301 [root@standby ~]# mysql -uroot -p123 302 [root@standby ~]# mysql -uroot -p456 303 304 305 306 7.数据类型和字符集 307 整型 308 int 最多存10位数字 309 -2^31 ~ 2^31-1 310 2^32 10位数 11 311 浮点 312 313 字符串类型 314 char 定长,存储数据效率较高,对于变化较多的字段,空间浪费较多 315 varchar 变长,存储时判断长度,存储会有额外开销,按需分配存储空间. 316 enum 317 时间 318 datetime 319 timestamp 320 date 321 time 322 323 SQL语句规范第五条: 324 1.少于10位的数字int ,大于10位数 char,例如手机号 325 2.char和varchar选择时,字符长度一定不变的可以使用char,可变的尽量使用varchar 326 在可变长度的存储时,将来使用不同的数据类型,对于索引树的高度是有影响的. 327 3.选择合适的数据类型 328 4.合适长度 329 330 331 8.索引及执行计划 332 333 8.1 索引 334 作用: 优化查询,select 查询有三种情况:缓存查询(不在mysql中进行数据查询),全表扫描,索引扫描 335 336 8.2 索引种类 337 Btree(btree b+tree b*tree) 338 Rtree 339 HASH 340 FullText 341 342 8.3 Btree 分类 343 聚集索引:基于主键,自动生成的,一般是建表时创建主键.如果没有主键,自动选择唯一键做为聚集索引. 344 辅助索引:人为创建的(普通,覆盖) 345 唯一索引:人为创建(普通索引,聚集索引) 346 347 聚集索引和辅助索引的对比 348 1.聚集索引:叶子结点,按照主键列的顺序,存储的整行数据,就是真正的数据页 349 2.辅助索引: 叶子结点,列值排序之后,存储到叶子结点+对应的主键的值,便于回表查询 350 351 352 353 8.4 索引管理命令 354 8.4.1 索引键(key),表中的某个列 355 356 辅助索引(BTREE) 357 怎么生成的: 358 根据创建索引时,指定的列的值,进行排序后,存储的叶子节点中 359 好处: 360 1.优化了查询,减少cpu mem IO消耗 361 2.减少的文件排序 362 363 364 创建普通辅助索引(MUL) 365 alter table blog_userinfo add key idx_email(email); 366 create index idx_phone on blog_userinfo(phone); 367 查看索引 368 desc blog_userinfo; 369 show index from blog_userinfo; 370 删除索引 371 alter table blog_userinfo drop index idx_email; 372 drop index idx_phone on blog_userinfo; 373 374 前缀索引 375 select count(*),substring(password,1,20) as sbp from blog_userinfo group by sbp; 376 alter table blog_userinfo add index idx(password(10)); 377 378 379 唯一键索引(UNI,如果有重复值是创建不了的) 380 alter table blog_userinfo add unique key uni_email(email); 381 382 覆盖索引(联合索引) 383 作用:不需要回表查询,不需要聚集索引,所有查询的数据都从辅助索引中获取 384 385 select * from people where gender , age , money 386 a,b,c 387 388 where a b c 389 where a b 390 391 alter table t1 add index idx_gam(gender,age,money); 392 393 a b c 394 395 where b c a 396 where c a b 397 where c 398 where b 399 400 401 好处: 402 减少回表查询的几率 403 ==================================================== 404 405 9. explain(desc)命令的应用 406 获取优化器选择后的执行计划 407 408 oldguo [world]>explain select * from city where countrycode=\'CHN\'\G 409 *************************** 1. row *************************** 410 id: 1 411 select_type: SIMPLE 412 table: city 413 type: ref 414 possible_keys: CountryCode,idx_co_po 415 key: CountryCode 416 key_len: 3 417 ref: const 418 rows: 1 419 Extra: Using index condition 420 1 row in set (0.00 sec) 421 422 423 8.2 重要的字段 424 425 8.2.1 type: 查询类型 426 作用: 427 1. 可以判断出,全表扫描还是索引扫描(ALL就是全表扫描,其他的就是索引扫描) 428 2. 对于索引扫描来讲,又可以细划分,可以判断是哪一种类的索引扫描 429 type的具体类型介绍: 430 ALL:全表扫描 431 select * from t1; 432 Index:全索引扫描 433 例子: 434 desc select countrycode from city ; 435 436 range:索引范围扫描 437 where > < >= <= 438 in or between and 439 like \'CH%\' 440 441 in 或者 or 改写成 union 442 select * from city where countrycode=\'CHN\' 443 union all 444 select * from city where countrycode=\'USA\'; 445 446 ref:辅助索引的等值查询 447 select * from city where countrycode=\'CHN\' 448 449 eq_ref: 多表链接查询(join on ) 450 451 const ,system :主键或唯一键等值查询 452 453 Extra: 454 using filesort: 文件排序 455 将order by group by distinct 后的列和where条件列建立联合索引 456 457 458 459 possible_keys: CountryCode,idx_co_po ---->可能会走的索引 460 key: CountryCode ---->真正走的索引 461 type: ref ---->索引类型 462 Extra: Using index condition ---->额外信息 463 464 -------------------------------------- 465 建立索引的原则(运维规范) 466 467 一、数据库索引的设计原则: 468 469 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。 470 那么索引设计原则又是怎样的? 471 472 0.建表时一定要有主键,如果相关列可以作为主键,做一个无关列 473 474 1.选择唯一性索引 475 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。 476 例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。 477 如果使用姓名的话,可能存在同名现象,从而降低查询速度。 478 479 主键索引和唯一键索引,在查询中使用是效率最高的。 480 481 select count(*) from world.city; 482 select count(distinct countrycode) from world.city; 483 select count(distinct countrycode,population ) from world.city; 484 485 注意:如果重复值较多,可以考虑采用联合索引 486 487 488 2.为经常需要排序、分组和联合操作的字段建立索引 489 经常需要ORDER BY、GROUP BY,join on等操作的字段,排序操作会浪费很多时间。 490 如果为其建立索引,可以有效地避免排序操作。 491 492 3.为常作为where查询条件的字段建立索引 493 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此, 494 为这样的字段建立索引,可以提高整个表的查询速度。 495 3.1 经常查询 496 3.2 列值的重复值少(业务层面调整) 497 498 注:如果经常作为条件的列,重复值特别多,可以建立联合索引。 499 500 501 4.尽量使用前缀来索引 502 如果索引字段的值很长,***使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索 503 会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。 504 505 506 507 ------------------------以上的是重点关注的,以下是能保证则保证的-------------------- 508 509 5.限制索引的数目 510 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。 511 修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 512 513 6.删除不再使用或者很少使用的索引(percona toolkit) 514 表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理 515 员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。 516 517 7.大表加索引,要在业务不繁忙期间操作 518 519 建索引原则 520 (1) 必须要有主键,如果没有可以做为主键条件的列,创建无关列 521 (2) 经常做为where条件列 order by group by join on的条件(业务:产品功能+用户行为) 522 (3) ***使用唯一值多的列作为索引,如果索引列重复值较多,可以考虑使用联合索引 523 (4) 列值长度较长的索引列,我们建议使用前缀索引. 524 (5) 降低索引条目,一方面不要创建没用索引,不常使用的索引清理,percona toolkit 525 (6) 索引维护要避开业务繁忙期 526 527 业务: 528 1.产品的功能 529 2.用户的行为 530 531 =============================================== 532 533 不走索引的情况(开发规范) 534 535 重点关注: 536 1) 没有查询条件,或者查询条件没有建立索引 537 538 select * from tab; 全表扫描。 539 select * from tab where 1=1; 540 541 在业务数据库中,特别是数据量比较大的表。 542 是没有全表扫描这种需求。 543 544 1、对用户查看是非常痛苦的。 545 2、对服务器来讲毁灭性的。 546 547 (1)select * from tab; 548 549 SQL改写成以下语句: 550 selec * from tab order by price limit 10 需要在price列上建立索引 551 552 553 (2) 554 select * from tab where name=\'zhangsan\' name列没有索引 555 556 改: 557 1、换成有索引的列作为查询条件 558 2、将name列建立索引 559 560 561 562 563 2) 查询结果集是原表中的大部分数据,应该是25%以上。 564 565 查询的结果集,超过了总数行数25%,优化器觉得就没有必要走索引了。 566 567 假如:tab表 id,name id:1-100w ,id列有索引 568 569 select * from tab where id>500000; 570 571 如果业务允许,可以使用limit控制。 572 573 怎么改写 ? 574 结合业务判断,有没有更好的方式。如果没有更好的改写方案 575 尽量不要在mysql存放这个数据了。放到redis里面。 576 577 578 3) 索引本身失效,统计数据不真实 579 索引有自我维护的能力。 580 对于表内容变化比较频繁的情况下,有可能会出现索引失效。 581 582 583 4) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 584 例子: 585 错误的例子:select * from test where id-1=9; 586 正确的例子:select * from test where id=10; 587 588 算术运算 589 函数运算 590 desc select * from blog_userinfo where DATE_FORMAT(last_login,\'%Y-%m-%d\') >= \'2019-01-01\'; 591 592 子查询 593 594 5)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 595 596 select * from t1 where telnum=110; 597 598 599 这样会导致索引失效. 错误的例子: 600 ------------------------ 601 mysql> alter table tab add index inx_tel(telnum); 602 Query OK, 0 rows affected (0.03 sec) 603 Records: 0 Duplicates: 0 Warnings: 0 604 605 mysql> 606 mysql> desc tab; 607 +--------+-------------+------+-----+---------+-------+ 608 | Field | Type | Null | Key | Default | Extra | 609 +--------+-------------+------+-----+---------+-------+ 610 | id | int(11) | YES | | NULL | | 611 | name | varchar(20) | YES | | NULL | | 612 | telnum | varchar(20) | YES | MUL | NULL | | 613 +--------+-------------+------+-----+---------+-------+ 614 3 rows in set (0.01 sec) 615 616 617 mysql> select * from tab where telnum=\'1333333\'; 618 +------+------+---------+ 619 | id | name | telnum | 620 +------+------+---------+ 621 | 1 | a | 1333333 | 622 +------+------+---------+ 623 1 row in set (0.00 sec) 624 625 mysql> select * from tab where telnum=1333333; 626 +------+------+---------+ 627 | id | name | telnum | 628 +------+------+---------+ 629 | 1 | a | 1333333 | 630 +------+------+---------+ 631 1 row in set (0.00 sec) 632 633 mysql> explain select * from tab where telnum=\'1333333\'; 634 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 635 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 636 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 637 | 1 | SIMPLE | tab | ref | inx_tel | inx_tel | 63 | const | 1 | Using index condition | 638 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 639 1 row in set (0.00 sec) 640 641 mysql> explain select * from tab where telnum=1333333; 642 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 643 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 644 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 645 | 1 | SIMPLE | tab | ALL | inx_tel | NULL | NULL | NULL | 2 | Using where | 646 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 647 1 row in set (0.00 sec) 648 649 650 mysql> explain select * from tab where telnum=1555555; 651 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 652 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 653 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 654 | 1 | SIMPLE | tab | ALL | inx_tel | NULL | NULL | NULL | 2 | Using where | 655 +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 656 1 row in set (0.00 sec) 657 658 mysql> explain select * from tab where telnum=\'1555555\'; 659 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 660 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 661 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 662 | 1 | SIMPLE | tab | ref | inx_tel | inx_tel | 63 | const | 1 | Using index condition | 663 +----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+ 664 1 row in set (0.00 sec) 665 666 mysql> 667 668 --------------------------------------- 669 670 6) 671 <> ,not in 不走索引 672 673 EXPLAIN SELECT * FROM teltab WHERE telnum <> \'110\'; 674 EXPLAIN SELECT * FROM teltab WHERE telnum NOT IN (\'110\',\'119\'); 675 ------------ 676 mysql> select * from tab where telnum <> \'1555555\'; 677 +------+------+---------+ 678 | id | name | telnum | 679 +------+------+---------+ 680 | 1 | a | 1333333 | 681 +------+------+---------+ 682 1 row in set (0.00 sec) 683 684 mysql> explain select * from tab where telnum <> \'1555555\'; 685 686 687 ----- 688 单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limit 689 or或in 尽量改成union 690 691 EXPLAIN SELECT * FROM teltab WHERE telnum IN (\'110\',\'119\'); 692 改写成: 693 694 EXPLAIN SELECT * FROM teltab WHERE telnum=\'110\' 695 UNION ALL 696 SELECT * FROM teltab WHERE telnum=\'119\' 697 698 ----------------------------------- 699 7) like "%_" 百分号在最前面不走 700 701 EXPLAIN SELECT * FROM teltab WHERE telnum LIKE \'31%\' 走range索引扫描 702 703 EXPLAIN SELECT * FROM teltab WHERE telnum LIKE \'%110\' 不走索引 704 705 706 %linux%类的搜索需求,可以使用elasticsearch 专门做搜索服务的数据库产品 707 708 709 8) 单独引用联合索引里非第一位置的索引列.作为条件查询时不走索引. 710 列子: 711 复合索引: 712 713 DROP TABLE t1 714 CREATE TABLE t1 (id INT,NAME VARCHAR(20),age INT ,sex ENUM(\'m\',\'f\'),money INT); 715 716 ALTER TABLE t1 ADD INDEX t1_idx(money,age,sex); 717 718 DESC t1 719 SHOW INDEX FROM t1 720 721 走索引的情况测试: 722 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money=30 AND age=30 AND sex=\'m\'; 723 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money=30 AND age=30 ; 724 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money=30 AND sex=\'m\'; ----->部分走索引 725 不走索引的: 726 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age=20 727 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age=30 AND sex=\'m\'; 728 EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE sex=\'m\'; 729 730 731 ===========压力测试=========== 732 1、模拟数据库数据 733 为了测试我们创建一个oldboy的库创建一个t1的表,然后导入50万行数据,脚本如下: 734 vim slap.sh 735 #!/bin/bash 736 HOSTNAME="localhost" 737 PORT="3306" 738 USERNAME="root" 739 PASSWORD="123" 740 DBNAME="oldboy" 741 TABLENAME="t1" 742 #create database 743 mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "drop database if exists ${DBNAME}" 744 create_db_sql="create database if not exists ${DBNAME}" 745 mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}" 746 #create table 747 create_table_sql="create table if not exists ${TABLENAME}(stuid int not null primary key,stuname varchar(20) not null,stusex char(1) 748 not null,cardid varchar(20) not null,birthday datetime,entertime datetime,address varchar(100)default null)" 749 mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table_sql}" 750 #insert data to table 751 i="1" 752 while [ $i -le 500000 ] 753 do 754 insert_sql="insert into ${TABLENAME} values($i,\'alexsb_$i\',\'1\',\'110011198809163418\',\'1990-05-16\',\'2017-09-13\',\'oldboyedu\')" 755 mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}" 756 let i++ 757 done 758 #select data 759 select_sql="select count(*) from ${TABLENAME}" 760 mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" 761 762 执行脚本: 763 sh slap.sh 764 765 766 2、检查数据可用性 767 mysql -uroot -p123 768 select count(*) from oldboy.t1; 769 770 3、在没有优化之前我们使用mysqlslap来进行压力测试 771 mysqlslap --defaults-file=http://www.likecs.com/etc/my.cnf \ 772 --concurrency=100 --iterations=1 --create-schema=\'oldboy\' \ 773 --query="select * from oldboy.t1 where stuname=\'alexsb_100\'" engine=innodb \ 774 --number-of-queries=2000 -uroot -p123 -verbose

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggfss.html