#mysql

MySQL 索引设计概要

Published at April 30, 2019 ·  1 min read

如何正确高效的设计索引,由于 hdd 的特性,随即访问数据是非常耗时的,对于数据库,无论是读取一行还是多行数据,都会将该行或多行所在的页面全部加载进来,然后再读取对应的数据记录。在 mysql 中,页的大小一般为 16 kb,也可能是 8kb,32 kb 或者其他值。数据库等待一个页从磁盘读取到缓存池所需要的成本巨大,需要消耗 10ms 左右的时间,如果顺序读取则会非常快,达到 40MB/s。如果一个页面的大小为 4kb,那么 1s 的时间就可以读取 10000 个页,读取一个页面所花费的平均时间就是 0.1 ms,相比随即读取的 10ms 已经降低了两个数量级,甚至比内存中读取数据还要快。数据库索引设计与优化中,分为宽索引与窄索引,每一个在索引中匹配到的记录行最终都需要执行另外的随即读取从聚集索引中获得剩余的数据,如果结果集非常大,那么就会导致随机读取的次数过多进而影响性能。 MySQL 索引设计概要...


为什么使用 B-Tree(B+Tree)

Published at April 29, 2019 ·  1 min read

由于机械磁盘的特性,磁盘的存取速度比主存慢很多,往往是其的 几百分分之一,因此为了提高效率及减少磁盘 I/O,往往每次读取都会预读,即使读取一个字节,也需要从此往后读取一定长度的数据放入内存,预读的长度一般为页(page)的整数倍。而 B Tree 之所以高效,根据 B-Tree 的定义,可知检索一次最多需要访问 h 个节点,一次检索最多需要 h-1 次 I/O,渐进复杂度为 O(h) = O(logdN)。一般实际应用中,出度 d 是非常大的数字,通常超过 100, 因此 h 非常小(通常不超过3),所以 B-Tree 作为索引结构效率非常高 为什么使用 B-Tree(B+Tree)...


mysql中innodb和myisam对比及索引原理区别-云栖社区-阿里云

Published at April 29, 2019 ·  1 min read

如何选择 mysql 中的索引。 innoDB 支持事物和外键,支持 4 个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括 ACID,如果应用中需要执行大量的 insert 或 update 操作,则应该使用 InnoDB,这样可以提高多用户并发操作的性能,MyISAM 管理非事务表,提供高速存储和检索,以及全文搜索能力。如果应用中需要大量的 select 查询,则选择 MyISAM。InnoDB 使用的聚簇索引、索引就是数据,顺序存储,因此能缓存索引,也能缓存数据。MyISAM 堆组织表 使用的是非聚簇索引、索引和文件分开,随即存储,只能缓存索引。MyISAM 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM 还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。InnoDB 读写阻塞与事务隔离级别相关。 mysql中innodb和myisam对比及索引原理区别-云栖社区-阿里云...



为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的?

Published at March 20, 2019 ·  1 min read

为何要分库分表,单表适合的上限为 200万 条,单库适合的并发上限是 2000 qps。包括分库分表的方式,range 和 hash。 为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的?...


如何设计可以动态扩容缩容的分库分表方案?

Published at March 19, 2019 ·  1 min read

每个库正常承载的写入并发量是 1000,那么 32 个库就可以承载32 * 1000 = 32000 的写并发,如果每个库承载 1500 的写并发,32 * 1500 = 48000 的写并发,接近 5万/s 的写入并发,前面再加一个MQ,削峰,每秒写入 MQ 8 万条数据,每秒消费 5 万条数据。有些除非是国内排名非常靠前的这些公司,他们的最核心的系统的数据库,可能会出现几百台数据库的这么一个规模,128个库,256个库,512个库。1024 张表,假设每个表放 500 万数据,在 MySQL 里可以放 50 亿条数据。每秒的 5 万写并发,总共 50 亿条数据,对于国内大部分的互联网公司来说,其实一般来说都够了。谈分库分表的扩容,第一次分库分表,就一次性给他分个够,32 个库,1024 张表,可能对大部分的中小型互联网公司来说,已经可以支撑好几年了。 如何设计可以动态扩容缩容的分库分表方案?...


了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

Published at March 19, 2019 ·  1 min read

redis 缓存雪崩、缓存穿透、缓存击穿三种问题的解决办法,可通过建立 redis 集群,mysql 没有返回值时缓存为 None,可以将热点数据永不过期或者将数据以一随机时间缓存到另一台 redis 中做备用查询。 了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?...


数据库SQL优化大总结之 百万级数据库优化方案 - 雲霏霏 - 博客园

Published at March 19, 2019 ·  1 min read

sql 百万级数据库的优化,最好不要使用 null,避免全表扫描。where 尽量避免 不等于、大于、小于、对字段进行表达式操作、函数操作等容易导致全表扫描的操作。 数据库SQL优化大总结之 百万级数据库优化方案 - 雲霏霏 - 博客园...


MySQL性能优化的最佳20+条经验 | | 酷 壳 - CoolShell

Published at March 19, 2019 ·  1 min read

mysql 的优化经验,将大表拆成小表,对于常需要联合查询的表合成一个表,包含最近登陆一类的经常更新的数据,最好单独一张表以充分利用 mysql 自身的查询缓存 MySQL性能优化的最佳20+条经验 | | 酷 壳 - CoolShell...


Mysql Innodb 中的锁和意向锁

Published at January 1, 0001 ·  1 min read

Mysql Innodb 中存在者多种锁,分别是: Shared (S) lock,共享锁 Exclusive (X) lock,排他锁 以上两个锁均为行级(row)锁,当某个进程通过 S(只读) 锁定某一行时,其他进程可以申请这一行的 S 锁,而不能申请 X 锁。 当遇到某个表中的某行或某几行有 X 锁时,其他进程若想在此表内申请 X 锁时则需要遍历所有行查看是否有 X 锁,效率非常低。于是出现了 Intension Lock(意向锁) 与上述两种行级锁所不同的是意向锁是表级锁,只有当真正得到某一行的锁时,才是行级锁并与其他欲申请此行的锁相冲突。 当再向一个表添加表级X锁的时候 * 如果没有意向锁的话,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突 * 如果有了意向锁,只需要判断该意向锁与即将添加的表级锁是否兼容即可。因为意向锁的存在代表了,有行级锁的存在或者即将有行级锁的存在。因而无需遍历整个表,即可获取结果 InnoDB Locking ...


Redis 缓存与 Mysql 数据库中的数据一致性

Published at January 1, 0001 ·  1 min read

Redis 缓存将数据保存在内容中,很好的缓解了 Mysql 在高并发时的压力,根据实际场景的需求,可以将缓存的时间增长或减小,小到五秒甚至更短。 但是,如果用户对数据库进行删改等改变 Mysql 数据的行为,那这 5s 的时间内将会出现数据不一致的问题。 通常的做法是,在数据库出现删改等行为时将 Redis 中相应的数据删掉,下次请求时,则会向 mysql 发起请求并将得到的数据保存到 Redis 中。 这种设计中分别包含两次操作:1. 删除 Redis 中的 2. 增删改 Mysql 中的数据 在这种设计情况下,则可能会出现在进行完成 1 操作后到进行 2 操作前的请求,请求会 cache miss 到 Mysql 请求原来的数据并放到 Redis 中,那之后的数据均为脏数据。 面对这种情况一种解决方法则是在 2 完成后再进行一次 1,以保证 Redis 中的脏数据不存在 当然,还有一种方法则是利用 mysql 自有的 binlog 向 redis 提交更新数据。同一机房的情况下可以做到百毫秒以内。 https://yunpengn.github.io/blog/2019/05/04/consistent-redis-sql/ ...


Tags

abcs accept acid activemq affinity algorithm allocation android array async aws b+tree b-tree backoff benchmark best-practices bfs big-o bigquery bind bitcount blog break broker bubble buffer cache cap cert cgroups channel citus class classmethod closure closures cluster concurrency config consistency consumer container context cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator deepcopy defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll equal errgroup escaping event extra fabric2 facebook-pixel financial-report flask flutter forward-proxy freelance frontend frp garbage-collector gc gcp generator gesture get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index init innodb instagram intention-lock intergration interview ios is javascript jinja2 jobboard json jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer lock logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm mobile model mongo mongoose mq myisam mysql namespace nat netflix network network-extension nginx nodejs nomad nosql notification npm oodesign openssl optimization orm osi pandas parallelism paramiko parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender private-key process proxy proxycommand put pvm python queue rabbitmq rbac react-native reactive reactjs rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq rsa rxswift saas scaffold scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm singleton slack slave slow-query sniper sns socket socks5 source-code spa sql sqlalchemy sqs ssh ssl ssl-pinning stack startup state stateful stateless staticmethod string struct swift swiftui switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp userdefaults variable vc voidcallback vpn vuejs weak web web-development where widget with yarn zset 削峰 单例模式 宽索引 异步 看源码学-golang 窄索引 解耦 跨域 跳板机


Archives

2020 (6)
2019 (157)
0001 (5)