一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。
1 数据库表建立索引默认规则:
(1)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
(2).尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
(3)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
(4)索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
2 数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度。但是,有些情况索引是不会起效的:
(1)、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
(2)、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
(3)、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
(4)、下面的查询也将导致全表扫描:
select id from t where name like ‘%abc%’
若要提高效率,可以考虑全文检索。
(5)、in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
(6)、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
(7)、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
(8)、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′
来自于网络总结---未完
分享到:
相关推荐
### MySQL数据库开发的三十六条军规 #### 一、核心军规 1. **尽量不在数据库做运算** - **原则**: 不要在数据库层面上执行复杂的运算逻辑。 - **原因**: 数据库的设计主要是为了高效地存储和检索数据,而不是...
实用工具,基于C#+MySQL开发的双色球分析工具,含完整源码、数据库脚本、所有历史开奖数据,能实时同步开奖数据,必中500万 双色球总共有 1772,1088 种结果,除去蓝球有 100,7568 种结果,中奖概率为 0....
测试的标准是插入1500万条数据,并使用100个并发线程进行操作。测试结果显示,最终的TPS(每秒事务处理量)达到了17432,这表明MyCat在这样的环境下具有较好的并发处理能力。随着测试的进行,数据插入的速度在不断...
单表数据量的最佳范围是500万至1000万条,超出后同样会影响性能。 3. **硬件限制**:单个服务器的磁盘空间有限,高并发访问可能导致磁盘I/O负载过高。 #### 三、数据库性能优化策略 针对上述性能瓶颈,常见的优化...
以一个包含1000万条记录的数据库为例,如果需要找到其中某一条特定的记录(比如`name="shenjian"`),在没有索引的情况下,系统将不得不逐条记录地进行查找,这显然是不可接受的。因此,数据库索引的设计至关重要,...
2. **读取操作**:同样使用500个请求,每个请求随机根据`id`值读取10000条记录,共计读取500万条数据。 3. **索引优化**:在写入500万条记录后,在`id`字段上建立索引以提高读取速度。 #### 安装与使用 MongoDB的...
- **高通量测序**:一次运行即可产生数百万条序列,大大提高了数据量和覆盖度。 - **准确性较高**:使用单分子测序技术,减少了PCR扩增过程中的错误。 - **低成本**:总体成本较低,适用于大规模的基因组测序项目。 ...
- **压力**:500线程并发随机查询100万条记录,每线程查询4千次,共计200万次查询 - **命令**:`./test_stand_select_perf.sh jdbc:mysql://106.75.164.75:8066/testdb mycat123456 500 4000 1-1000000` - **结果...
万兆网卡的使用大大降低了网络传输的延迟,达到500,000纳秒的同数据中心内的往返时间,远优于发送2KB数据所需的20,000纳秒。 硬件发展趋势显示,从单核到多核,从DDR2到DDR3,再到DDR4,内存容量和速度不断提升;从...
- **文件同步**:对于包含大量文件的数据同步,如20000条记录可达800MB的文件,效率成为关键。 - **同步按需隔离**:不同业务间同步的独立性至关重要,避免因某个业务的同步速度影响其他业务。 - **事务性支持**:...
该商城预计将面对1万至1.2万的用户,每天的页面浏览量(PV)预计会在100万到500万之间,平均每秒查询速率(QPS)约为50-100次,每日活跃用户数(DAU)在2000至10000之间。根据这些业务需求,需要一种高效的解决方案来处理...
- **吞吐量**:Insert操作每分钟30万至40万条,Delete操作每分钟60万条。 - **延迟**:本地机房内单向同步延迟约100毫秒;中美两地机房间的单向/双向同步延迟约为2秒;中美两地机房间文件同步延迟约为10秒。 #### ...
- 假设我们有一个用户表`users`,有500万条数据,我们可以按照用户ID取模2,将其分为`user1`和`user2`两张表,每张表250万条数据。 ```sql CREATE TABLE user1 LIKE users; CREATE TABLE user2 LIKE users; ...
目前采取的策略是每天对JSON文件进行一次处理,当文件大小达到400MB至500MB之间时,便将其提取出来进行后续处理,此时文件中的数据量大约为20万条。 4. **数据处理与入库**:提取出的JSON文件会通过简单的脚本进行...
3. 高性能和高可用性:支持高并发查询,且在100台集群规模下可以达到每秒10万查询量(QPS)。拥有基于多副本的元数据高可用性,保证了线上服务的稳定性。 4. 易用性和兼容性:提供了MySQL协议的兼容性,支持在线表...
- 总用户数467万,包括36万教师用户,140万学生用户,280万家长用户,140万套餐用户。 - 每个学生有一个家长订阅了套餐业务。 - 每所学校有6个年级,每个年级有10个班级,每个班级有40个学生。 #### 四、具体测试...
性能指标方面,FameHistory的最大容量可以达到100到500万个数据点,存储性能可达每秒20到50万点,且单机支持最大2万个并发连接。 技术架构上,FameHistory实时数据库支持TCP连接方式,并使用5678端口作为缺省端口。...
在一台配置良好的 P4 级 UNIX 主机上, 100 万贴论坛平均页面处理时间不超过 0.03 秒(搜索除外),页面平均数据库查询数不超过5 个,最大承载在线人数超过 5000 人,如果构建 Apache 和数据库分离的双机系统,负载能力和...