个人总结,笔记:
在硬件方面了解的不多,总结下来:
我们所说的sql优化主要是指,sql查询速度。
在sql语句优化这方面也是最节约成本的。
建立索引的时候,还是得根据具体业务需要来建立。
select * from table where name=''zheng'' and id > 10000 和 执行 select * from table1 where id > 10000 and name=''zheng''
曾经以为第一个,先查name=''zheng'' 然后再查 id > 10000,第二个先查id > 10000再查name=''zheng''。事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”(个人只是简单了解了一下),它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。
如:name like ‘张%’ ,这就属于范围查找,会命中索引
而:name like ‘%张’ ,就属于全表扫描
2. or 会引起全表扫描
3. 典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等
4. exists 和 in 的执行效率是一样的
5. 用函数charindex()和前面加通配符%的LIKE执行效率一样
6. union并不绝对比or的执行效率高(这里要视情况而定)
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16'' or gid>9990000 全表扫描
但如下,union查询时可以命中索引
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000
查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。(这里指的是where后面的查询列)
7. 字段提取要按照“需多少、提多少”的原则,避免“select * from table”
8. order by按聚集索引列排序效率最高
9. 高效的TOP (SQL SERVER数据库)。在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。
10. 后续补充.....
例如:整个系统中的有业务模块,订单模块,用户模块等等都在一个数据库系统,相应的产生数据耦合性高,数据不隔离等问题。大并发的写入、读取操作导致系统性能下降。系统可用性在降低,这些都是需要待解决的,需要将这些数据进行分片,也就是分散开,均摊现有数据库的数据写入、查询压力。
此时,用到数据库的垂直拆分。将数据库以模块为单位拆分,以前集中在一个数据库的读写压力,现在分散到多个数据库中。其一,解决单个数据库的数据存储瓶颈。其二,在大并发情况下,提高数据读写性能。但是,当单表中的数据过大时,查询此表中的数据还是会慢(可以考虑分表了)。
其实水平拆分的核心思想是,将单一数据表数据按照我们约定的某种规则进行拆分到多个数据库和数据表中,我们的关注点是在表数据本身上。感觉多少有些类似水平分表的意思,这里不单单只考虑查询速度问题,还考虑的并发。
常用的按照某一个表的字段的区间做拆分,其中最常用的是“ 日期 ”字段了,例如:表中的创建时间字段,我们要查某个月的数据,可以将对应月份数据放进对应月份表中,这样我们可以根据创建时间定位到数据存储表,然后以相应查询条件进行查询。
主要为解决查询速度、并发。