`
zhaoxiaoxiao
  • 浏览: 17070 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql数据库效率。100万条数据--500万条数据

 
阅读更多
    一般的应用系统,读写比例在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数据库开发的三十六条军规

    ### MySQL数据库开发的三十六条军规 #### 一、核心军规 1. **尽量不在数据库做运算** - **原则**: 不要在数据库层面上执行复杂的运算逻辑。 - **原因**: 数据库的设计主要是为了高效地存储和检索数据,而不是...

    实用工具,基于C#+MySQL开发的双色球分析工具,含完整源码、数据库脚本、所有历史开奖数据,能实时同步开奖数据,必中500万

    实用工具,基于C#+MySQL开发的双色球分析工具,含完整源码、数据库脚本、所有历史开奖数据,能实时同步开奖数据,必中500万 双色球总共有 1772,1088 种结果,除去蓝球有 100,7568 种结果,中奖概率为 0....

    MyCat性能测试案例2

    测试的标准是插入1500万条数据,并使用100个并发线程进行操作。测试结果显示,最终的TPS(每秒事务处理量)达到了17432,这表明MyCat在这样的环境下具有较好的并发处理能力。随着测试的进行,数据插入的速度在不断...

    Mysql分库分表 分片理论概念6-12.docx

    单表数据量的最佳范围是500万至1000万条,超出后同样会影响性能。 3. **硬件限制**:单个服务器的磁盘空间有限,高并发访问可能导致磁盘I/O负载过高。 #### 三、数据库性能优化策略 针对上述性能瓶颈,常见的优化...

    数据库索引,到底是什么

    以一个包含1000万条记录的数据库为例,如果需要找到其中某一条特定的记录(比如`name="shenjian"`),在没有索引的情况下,系统将不得不逐条记录地进行查找,这显然是不可接受的。因此,数据库索引的设计至关重要,...

    主流NoSQL数据库全方位评测:MongoDB.docx.docx

    2. **读取操作**:同样使用500个请求,每个请求随机根据`id`值读取10000条记录,共计读取500万条数据。 3. **索引优化**:在写入500万条记录后,在`id`字段上建立索引以提高读取速度。 #### 安装与使用 MongoDB的...

    插入片段基因组学数据库和工具.pptx

    - **高通量测序**:一次运行即可产生数百万条序列,大大提高了数据量和覆盖度。 - **准确性较高**:使用单分子测序技术,减少了PCR扩增过程中的错误。 - **低成本**:总体成本较低,适用于大规模的基因组测序项目。 ...

    Mycat性能测试报告

    - **压力**:500线程并发随机查询100万条记录,每线程查询4千次,共计200万次查询 - **命令**:`./test_stand_select_perf.sh jdbc:mysql://106.75.164.75:8066/testdb mycat123456 500 4000 1-1000000` - **结果...

    利用新硬件提升数据库性能(“内存”文档)共33张.ppt

    万兆网卡的使用大大降低了网络传输的延迟,达到500,000纳秒的同数据中心内的往返时间,远优于发送2KB数据所需的20,000纳秒。 硬件发展趋势显示,从单核到多核,从DDR2到DDR3,再到DDR4,内存容量和速度不断提升;从...

    otter4使用介绍

    - **文件同步**:对于包含大量文件的数据同步,如20000条记录可达800MB的文件,效率成为关键。 - **同步按需隔离**:不同业务间同步的独立性至关重要,避免因某个业务的同步速度影响其他业务。 - **事务性支持**:...

    企业级架构中MongoDB部署使用手册

    该商城预计将面对1万至1.2万的用户,每天的页面浏览量(PV)预计会在100万到500万之间,平均每秒查询速率(QPS)约为50-100次,每日活跃用户数(DAU)在2000至10000之间。根据这些业务需求,需要一种高效的解决方案来处理...

    otter4使用介绍.pdf

    - **吞吐量**:Insert操作每分钟30万至40万条,Delete操作每分钟60万条。 - **延迟**:本地机房内单向同步延迟约100毫秒;中美两地机房间的单向/双向同步延迟约为2秒;中美两地机房间文件同步延迟约为10秒。 #### ...

    mysql分表程序改动方法

    - 假设我们有一个用户表`users`,有500万条数据,我们可以按照用户ID取模2,将其分为`user1`和`user2`两张表,每张表250万条数据。 ```sql CREATE TABLE user1 LIKE users; CREATE TABLE user2 LIKE users; ...

    爬虫的技术文档

    目前采取的策略是每天对JSON文件进行一次处理,当文件大小达到400MB至500MB之间时,便将其提取出来进行后续处理,此时文件中的数据量大约为20万条。 4. **数据处理与入库**:提取出的JSON文件会通过简单的脚本进行...

    Apache Doris (Incubating) 原理与实践.pdf

    3. 高性能和高可用性:支持高并发查询,且在100台集群规模下可以达到每秒10万查询量(QPS)。拥有基于多副本的元数据高可用性,保证了线上服务的稳定性。 4. 易用性和兼容性:提供了MySQL协议的兼容性,支持在线表...

    性能测试报告_仅供大家学习

    - 总用户数467万,包括36万教师用户,140万学生用户,280万家长用户,140万套餐用户。 - 每个学生有一个家长订阅了套餐业务。 - 每所学校有6个年级,每个年级有10个班级,每个班级有40个学生。 #### 四、具体测试...

    FameHistory实时数据库

    性能指标方面,FameHistory的最大容量可以达到100到500万个数据点,存储性能可达每秒20到50万点,且单机支持最大2万个并发连接。 技术架构上,FameHistory实时数据库支持TCP连接方式,并使用5678端口作为缺省端口。...

    Discuz! 3.1.2 商业版

    在一台配置良好的 P4 级 UNIX 主机上, 100 万贴论坛平均页面处理时间不超过 0.03 秒(搜索除外),页面平均数据库查询数不超过5 个,最大承载在线人数超过 5000 人,如果构建 Apache 和数据库分离的双机系统,负载能力和...

Global site tag (gtag.js) - Google Analytics