提高SQL执行效率的几点建议:
◆尽量不要在where中包含子查询;
关于时间的查询,尽量不要写成:where to_char(dif_date,’yyyy-mm-dd’)=to_char(‘2007-07-01′,’yyyy-mm-dd’);
◆在过滤条件中,可以过滤掉最大数量记录的条件必须放在where子句的末尾;
FROM子句中写在最后的表(基础表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有三个以上的连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表;
◆采用绑定变量
◆在WHERE中尽量不要使用OR
◆用EXISTS替代IN、用NOT EXISTS替代NOT IN;
◆避免在索引列上使用计算:WHERE SAL*12>25000;
◆用IN来替代OR: WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20
◆避免在索引列上使用IS NULL和IS NOT NULL;
◆总是使用索引的第一个列;
◆用UNION-ALL替代UNION;
◆避免改变索引列的类型:SELECT…FROM EMP WHERE EMPNO=’123′,由于隐式数据类型转换,to_char(EMPNO)=’123′,因此,将不采用索引,一般在采用字符串拼凑动态SQL语句出现;
◆’!=’ 将不使用索引;
◆优化GROUP BY;
◆避免带有LIKE参数的通配符,LIKE ‘4YE%’使用索引,但LIKE ‘%YE’不使用索引
◆避免使用困难的正规表达式,例如select * from customer where zipcode like “98___”,即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select * from customer where zipcode>”98000″,在执行查询时就会利用索引来查询,显然会大大提高速度;
◆尽量明确的完成SQL语句,尽量少让数据库工作。比如写SELECT语句时,需要把查询的字段明确指出表名。尽量不要使用SELECT *语句。组织SQL语句的时候,尽量按照数据库的习惯进行组织。
转自:
http://www.webjx.com/database/sqlserver-16738.htm
DataBase
SQLSERVER优化
有时我们使用了PHP框架,然后使用现成的ORM,省去了写SQL的麻烦,但又想看看到底生成了哪些SQL;或者下载了wordpress或druapl,想看看人家的SQL是怎么写的,这时如果能够监视MySQL的一举一动就好了,也不难,只需要稍微配置一下,再加上一个工具就行了。
首先,打开%MySQLDir%my.ini(linux下是my.cnf)加上这么一句
# 指定log的位置
log=C:/AppServ/MySQL/mysql.log
# 或者linux下 log=/var/log/mysql/mysql.log
这样,MySQL就会把所有操作记录都写在mysql.log这个文件里。接下来可以先清空这个文件,然后运行wordpress,再打开这个文件,就会看到所有执行的SQL了,不过这个有点麻烦,如果能实时查看就好了,linux下有tail命令 tail -f /var/log/mysql/mysql.log就行了,windows下没有相应的命令,这时就需要BareTail这个工具了,其实就是模拟tail操作的一个绿色可执行文件。打开后,浏览到之前定义的log文件,然后再运行wordpress,应该能看到BareTail里出现了SQL的操作记录,如下

可以看到wordpress的数据库开销还是挺大的。
BareTail 免费下载地址:
http://www.baremetalsoft.com/baretail/
转自: http://blog.pianzhizhe.com/archives/57
DataBase, PHP
sqlserver profile, 监视mysql
无法定位程序输入点 ?ProcessExecute@@YAXPAUHWND__@@PBG1@Z 于动态链接库 SEMSFC.dll 上。安装sqlserver2000的时候经常会出现这样的问题.很是无耐,经常只有重装sqlserver2000一次.但就算是重新安装也不一定能解决问题,怎么办呢?
其实我们有一个好的解决方案,那就是安装sp补丁.我的vista出现这种情况后,直接安装sp4补丁就解决了.
DataBase, Microsoft产品
SEMSFC.dll, sqlserver2000, 动态链接库
extjs.org.cn是用drupal来做论坛的,真他妈的不好用了. 被逼无耐,只好安装了个现在国内最多人使用,功能强大的discuz7.现在问题来了,以前的注册用户你总不能让用户再注册一次吧?没有办法,只能把原来drupal上的所有注册用户都迁移到discuz7上.
由于我的论坛跟drupal在同一个服务器,只是在不同的数据库服务器上,操作办法非常简单.只需一条sql语言即可搞定.
在导入用户之前你必须了解discuz7(ucenter)用户的加密算法.
discuz7(ucenter)用户的加密算法: md5密码后,再加上一个随机6位数,再md5一次.如下sql
1
| SELECT md5(concat(md5('mypassword'),'extjs.')) AS pass |
‘mypassword’ 为用户密码,’extjs.’为随机的6位数(其实不一定要随机,只要6位就可以了).
完整的迁移用户名密码的sql如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| INSERT INTO discuz7.cdb_uc_members
(
username,
password,
email,
myid,
myidkey,
regip,
regdate,
lastloginip,
lastlogintime,
salt,
secques
)
SELECT name,md5(concat(pass,'extjs.')) AS pass
,mail,'','','hidden',created,0,0,'extjs.',''
FROM drupal.users WHERE name != 'fatjames' AND name!= 'extjs.org.cn' |
DataBase, 网站应用
discuz7, drupal, ucenter, 转用户
今天升级了一个原来由Visual Studio 2002开发的一个asp.net+mysql项目,升级到.net framework 2.0后,编译没有任何错误,但居然不能运行了,提示信息如下:
Illegal mix of collations (latin1_swedish_ci,IMPLICIT), (gb2312_chinese_ci,COERCIBLE), (gb2312_chinese_ci,COERCIBLE)
解决办法如下:
1,修改数据库/表/字段的编码.
2,执行之前加上set names latin1;
3,更改my.ini的init-connect=” latin1″(没有则加上).
4,查询时加上强制字符编码转换
select * from table where name = ‘xxx’ COLLATE latin1_swedish_ci
ASP.NET, DataBase
以前一直用Power Designer V11,前段时间换了Vista系统后,V11的版本居然不能用了,没办法,只好去sybase的官方网站下了一个最新版的V12.5.虽然只是试用版的,但感觉还是非常不错.
原版下载地址: http://download.sybase.com/eval/PowerDesigner/powerdesigner125_eval.exe
如果需要用到破解版的朋友,可以参考这篇文章.
http://www.cnblogs.com/andan/articles/1318960.html
附截图:

DataBase
很久没有安装过xampp了,今天从官方网站下载一个最新的回来.启动apache非常成功,当启动mysql的时候提示 1067 错误.以前在winxp下都很正常的,难道在vista下还不一样?
当然首先到google搜索了一翻,发现很多答案.
1,mysql的目录必须有everyone的执行权限.
2,windows目录下的mysql.ini没有被删除,启动时用了这一个配置文件.
3,#设置basedir指向mysql的安装路径
basedir=d:\xampp\mysql
datadir=d:\xampp\mysql\data
4,my.ini(my.cnf)有问题,需要在指定的路径上面加上盘符.
我就是用第四种方法成功的,以下是我更改后的my.cnf文件其中的一段.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# The following options will be passed to all MySQL clients
[client]
# password = your_password
port = 3306
socket = "d:/xampp/mysql/mysql.sock"
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port= 3306
socket= "d:/xampp/mysql/mysql.sock"
basedir="d:/xampp/mysql"
tmpdir="d:/xampp/tmp"
datadir="d:/xampp/mysql/data"
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M |
DataBase
Mysql 1067, mysql.cnf, Mysql.ini
今天安装了个mysql5.0,拿了一个很久之前网上下的程序检查一下是否工作正常.
发现以前的程序居然不能正常运行,提示信息如下:
Database error: Invalid SQL: INSERT INTO Survey_UserHistory(userId,jobId,type,action,startTime,endTime) VALUES(‘17′,”,’User’,'Login’,”,’2008-11-23 14:33:56′)
MySQL error: 1366 (Incorrect integer value: ” for column ‘jobId’ at row 1)
Session halted.
第一时间的反应是跟mysql5.0新加的sql-mode有关系,因为前一阵子刚刚看过手册.果然,作了如下更改后就不再提示了.
修改 my.ini 文件.
# Set the SQL mode to strict
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
改为:
# Set the SQL mode to strict
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
DataBase
Incorrect integer value, mysql STRICT_TRANS_TABLES, sql-mode
最新评论