如何设计一个能高效查询的千万级MySQL数据库?
1,每秒查询次数是多少?
2、每次查询的长度
确定后,再考虑以下因素的优化。
1,存储的类型,SSD可以把普通磁盘的随机读写能力提高很多,一般2到3个数量级,取决于索引和数据块的大小,比较复杂。
2.首先选择RAID类型。如果选择raid0和raid10,速度大约可以提高1倍。
3.使用高带宽的网络速度可以减少网络传输延迟。理论上,使用10g光纤比1g光缆可以提高1个数量级的吞吐量,对于数据量较大的结果集尤其有效。
4、合理的索引,有条件的搜索字段加一个索引
5.使用大而宽的表,尽量减少多表关联查询,用空间换时间。
6、_采用主从式集群,基本上并发查询的数量与服务器的数量成正比。
7、缓存的使用,比如memcached,特别是对于静态数据的提升。
8、合理选择数据库字段类型,用定长字,不要变长,比如定长int、char、decimal类型,不要varchar、text等。
9.为数据库配置更多内存。
10,检查瓶颈是否在CPU。如果查询很复杂,请切换到配置更高的服务器。
总的原则是尽可能用内存代替触控盘来提高IO速度和改善网络和CPU的配置来减少查询时间;尽可能提高网速、内存和主机数量,提高并发性。
先讨论一下非高并发的实现。
对于查询频率高的字段,添加一个索引。
索引说明:
1.最好不要索引那些内容比较长的字符。
2.根据官方文件,添加到单个表中的索引数量不能超过16,索引长度不能超过256字节。
随意添加索引会增加数据维护的负担。
其实可以引入分区。
分区的注意事项:
1.常见的分区类型有范围、列表、哈希、键等。范围划分用得比较多。
2.对于初始索引,我们往往会忽略一个先决条件,导致添加和报告错误失败。
这里的前提是,如果表有主键,分区键和主键不一样,那么分区键也一定是主键。
引入分区后,当写入数据时,数据库会自动确定写入哪个分区。
对于高并发的,除了以上操作,还要考虑将数据库分表或者采用一主多从的模式。
在未来,我相信这类问题需要通过使用数据库来解决,比如NewSQl,比如TiDb等。这时候我们就不用考虑数据分区的问题了,可以实现数据级别的无限扩展和热点数据的动态分布。