一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Database

Sql Server 常用系统存储过程大全

— 来源于网络 — 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回。 xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置 xp_logininfo --*返回有关Windows 认证登录的信息。 xp_msver --*返回有关Microsoft SQL Server 的版本信息 xp_enumgroups    --返回Windows用户组列表或在指定域中的全局组列表。 xp_sendmail  --将电子邮件发送给指定的收件人(后续版本将删除该功能)。 xp_readmail --阅读SQL Mail收件箱中的邮件(后续版本将删除该功能)。 xp_deletemail --删除Microsoft SQL Server 收件箱中的邮件(后续版本将删除该功能)。 xp_startmail --通过该过程启动SQL Mail将返回两条消息,主要用于故障排除。 xp_stopmail --停止SQL 邮件客户端会话(后续版本将删除该功能)。 xp_grantlogin  --授予Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_revokelogin   --撤消Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_logevent --将用户定义消息记入SQL Server 日志文件和Windows 事件查看器。 xp_sprintf --设置一系列字符和值的格式并将其存储到字符串输出参数中。每个格式参数都用相应的参数替换。 xp_sqlmaint --使用包含sqlmaint 开关的字符串调用sqlmaint 实用工具(后续版本将删除该功能)。 xp_sscanf      --将数据从字符串读入每个格式参数所指定的参数位置。   sp_ActiveDirectory_Obj --控制数据库在Windows活动目录中的注册。 sp_ActiveDirectory_SCP  --控制已连接实例的数据库在Windows活动目录中的注册。 sp_add_agent_parameter --将新参数及其值添加到代理配置文件中。 sp_add_agent_profile --为复制代理创建新的配置文件。 sp_add_alert --创建一个警报。 sp_add_category --将指定的作业、警报或操作员类别添加到服务器中。 sp_add_job --*添加由SQLServerAgent 服务执行的新作业。 sp_add_jobschedule --*创建作业计划。 sp_add_jobserver --在指定的服务器中,以指定的作业为目标。 sp_add_jobstep --*在作业中添加一个步骤(操作)。 sp_add_log_shipping_alert_job  --检查是否已在此服务器上创建了警报作业,无则创建。 sp_add_log_shipping_primary_database --设置日志传送配置(包括备份作业、本地监视记录及远程监视记录)的主数据库。 […]

龙生   06 Nov 2015
View Details

关于redis、memcached、mongoDB 的对比

从以下几个维度,对redis、memcached、mongoDB 做了对比,欢迎拍砖 1、性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcached差不多,要大于mongodb 2、操作的便利性       memcached数据结构单一       redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数        mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 3、内存空间的大小和数据量的大小        redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)        memcached可以修改最大可用内存,采用LRU算法        mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起 4、可用性(单点问题) 对于单点问题,              redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题, 所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。 一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡              Memcached本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。              mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。 5、可靠性(持久化) 对于数据持久化和数据恢复,          redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响           memcached不支持,通常用在做缓存,提升性能;           MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性 6、数据一致性(事务支持)          Memcached 在并发场景下,用cas保证一致性         redis事务支持比较弱,只能保证事务中的每个操作连续执行         mongoDB不支持事务 7、数据分析          mongoDB内置了数据分析的功能(mapreduce),其他不支持 8、应用场景         redis:数据量较小的高性能操作和运算上         memcached:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)         MongoDB:主要解决海量数据的访问效率问题 from:http://blog.csdn.net/yangbutao/article/details/7437290

龙生   23 Oct 2015
View Details

在Mac如何启动MySQL

安装好MySQL服务后(安装步骤可以参考系列经验1)。打开“系统偏好设置”,单击下端的“MySQL”图标。 在“MySQL”对话框中,单击“启动MySQL服务”按钮。 在弹出的窗口中,输入管理员密码,然后单击“好”按钮。 在“MySQL”对话框中,MySQL服务的状态显示为:如下状态表示MySQL服务已经启动。 使用终端登录MySQL:  在Finder的侧边栏中单击“应用程序”,然后在“实用工具”中,双击启动“终端”命令。  在终端中输入添加MySQL路径的命令: PATH="$PATH":/usr/local/mysql/bin  在终端登录到MySQL的命令如下:mysql -u root -p 然后输入密码,如果没有设置密码,直接按enter键。  如果显示的内容如下,即是已经成功登录到MySQL服务。  

龙生   13 Sep 2015
View Details

PowerDesigner更改数据库类型

工具:powerdesigner

数据库:sql server2000 --> mysql 5.0

1、更改数据库

14207159_1

将DBMS里的数据库(原为sqlserver2000)改为mysql5.0

2、生成mysql脚本

Database --> Generate Database

在directory里选择生成的sql脚本存放的路径;

在file name里修改sql脚本的名字;

one file only 勾选后,只生成一个sql脚本;不勾选,按照表的个数生成多个脚本;

由于建模时是按sqlserver标准设计的,转成mysql会有错误,取消掉check model前面的勾可避免生成sql脚本时发生如下的错误:

Generation aborted due to errors detected during the verification of the model.

其他错误见结尾

为了避免错误,在此将create primary key改为inside

format选项卡里主要修改文本格式,如果有中文,改成UTF-8,避免生成的脚本有乱码;

在这个选项卡里选择workspace,点击旁边的include sub_objects,在下面的列表里会显示该工程下的所有表。点击select all,列表中的所有表前面会出现勾(也可以只选择几个表)。

点击确定,完成脚本生成。
———————————————————--

常见问题

自增问题: 解决方法如下:

在你所要设为自增型的键上(比如你的 id )双击,弹出一个 Column Properties 对话框,右下角有一个 Identify 的选择框,选中它 OK ,就可以了。

再去查看 Preview ,就能看到用大写标识出来的 AUTO_INCREMENT 。

右键表属性在physical options中可设置表类型MYISAM

设置字段默认值 :双击表,出现 column 列表,双击要设置的列的左边的灰色框,应该会弹出新的窗口,然后在新窗口上选择 standard   checks   ,里面有 default 的默认值

SQL Server2008附加数据库失败 错误号:5120

附加数据库时,显示错误,错误信息为

一种解决方法为,设置mdf文件所在文件夹的权限(有些资料说只设置mdf文件的权限就好,但我试了不管用),在文件夹上右击——属性——安全,如图所示:

选择组或用户名中的Authenticated Users,点击编辑修改权限,选中允许完全控制,确定即可。

另一种解决方法,查了资料说不要用sa账户登录,用windows身份验证登录就可以附加成功,但是我的正好相反,用windows身份验证登录不能成功,用sa账户登录就可以附加成功。(真是无比神奇呀~~如果有大牛知道为啥麻烦告知一下,不胜感激呀)

from:http://blog.163.com/zhang_ying112/blog/static/19826008020128308257856/

mysql in 子查询 效率慢 优化(转)

现在的CMS系统、博客系统、BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下。但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久!百思不解(后来终于解决),我的表结构是下面这样的,文章只有690篇。

文章表article(id,title,content)
标签表tag(tid,tag_name)
标签文章中间表article_tag(id,tag_id,article_id)
其中有个标签的tid是135,我帮查询标签tid是135的文章列表
用以下语句时发现速度好慢,我文章才690篇
select id,title from article where id in(
select article_id from article_tag where tag_id=135
)
其中这条速度很快:select article_id from article_tag where tag_id=135
查询结果是五篇文章,id为428,429,430,431,432
我用写死的方式用下面sql来查文章也很快
select id,title from article where id in(
428,429,430,431,432
)
我在SqlServer中好像不会这样慢,不知MySQL怎样写好点,也想不出慢在哪里。

后来我找到了解决方法:

select id,title from article where id in(
select article_id from (select article_id from article_tag where tag_id=135) as tbt
)

 

 

其它解决方法:(举例)

mysql> select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');

为了节省篇幅,省略了输出内容,下同。

67 rows in set (12.00 sec)

只有67行数据返回,却花了12秒,而系统中可能同时会有很多这样的查询,系统肯定扛不住。用desc看一下(注:explain也可)

mysql> desc select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');
+—-+——————--+——————+——--+—————--+——-+———+————+———+————————--+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+——————--+——————+——--+—————--+——-+———+————+———+————————--+
| 1 | PRIMARY | abc_number_prop | ALL | NULL | NULL | NULL | NULL | 2679838 | Using where |
| 2 | DEPENDENT SUBQUERY | abc_number_phone | eq_ref | phone,number_id | phone | 70 | const,func | 1 | Using where; Using index |
+—-+——————--+——————+——--+—————--+——-+———+————+———+————————--+
2 rows in set (0.00 sec)

从上面的信息可以看出,在执行此查询时会扫描两百多万行,难道是没有创建索引吗,看一下

mysql>show index from abc_number_phone;
+——————+————+————-+————--+—————--+———--+————-+———-+——--+——+————+———+—————+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+——————+————+————-+————--+—————--+———--+————-+———-+——--+——+————+———+—————+
| abc_number_phone | 0 | PRIMARY | 1 | number_phone_id | A | 36879 | NULL | NULL | | BTREE | | |
| abc_number_phone | 0 | phone | 1 | phone | A | 36879 | NULL | NULL | | BTREE | | |
| abc_number_phone | 0 | phone | 2 | number_id | A | 36879 | NULL | NULL | | BTREE | | |
| abc_number_phone | 1 | number_id | 1 | number_id | A | 36879 | NULL | NULL | | BTREE | | |
| abc_number_phone | 1 | created_by | 1 | created_by | A | 36879 | NULL | NULL | | BTREE | | |
| abc_number_phone | 1 | modified_by | 1 | modified_by | A | 36879 | NULL | NULL | YES | BTREE | | |
+——————+————+————-+————--+—————--+———--+————-+———-+——--+——+————+———+—————+
6 rows in set (0.06 sec)

mysql>show index from abc_number_prop;
+—————--+————+————-+————--+—————-+———--+————-+———-+——--+——+————+———+—————+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+—————--+————+————-+————--+—————-+———--+————-+———-+——--+——+————+———+—————+
| abc_number_prop | 0 | PRIMARY | 1 | number_prop_id | A | 311268 | NULL | NULL | | BTREE | | |
| abc_number_prop | 1 | number_id | 1 | number_id | A | 311268 | NULL | NULL | | BTREE | | |
| abc_number_prop | 1 | created_by | 1 | created_by | A | 311268 | NULL | NULL | | BTREE | | |
| abc_number_prop | 1 | modified_by | 1 | modified_by | A | 311268 | NULL | NULL | YES | BTREE | | |
+—————--+————+————-+————--+—————-+———--+————-+———-+——--+——+————+———+—————+
4 rows in set (0.15 sec)

从上面的输出可以看出,这两张表在number_id字段上创建了索引的。

看看子查询本身有没有问题。

mysql> desc select number_id from abc_number_phone where phone = '82306839';
+—-+————-+——————+——+—————+——-+———+——-+——+————————--+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——————+——+—————+——-+———+——-+——+————————--+
| 1 | SIMPLE | abc_number_phone | ref | phone | phone | 66 | const | 6 | Using where; Using index |
+—-+————-+——————+——+—————+——-+———+——-+——+————————--+
1 row in set (0.00 sec)

没有问题,只需要扫描几行数据,索引起作用了。查询出来看看

mysql> select number_id from abc_number_phone where phone = '82306839';
+———--+
| number_id |
+———--+
| 8585 |
| 10720 |
| 148644 |
| 151307 |
| 170691 |
| 221897 |
+———--+
6 rows in set (0.00 sec)

直接把子查询得到的数据放到上面的查询中

mysql> select * from abc_number_prop where number_id in (8585, 10720, 148644, 151307, 170691, 221897);

67 rows in set (0.03 sec)

速度也快,看来MySQL在处理子查询的时候是不够好。我在MySQL 5.1.42 和 MySQL 5.5.19 都进行了尝试,都有这个问题。

搜索了一下网络,发现很多人都遇到过这个问题:

参考资料1:使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
http://blog.csdn.net/hongsejiaozhu/article/details/1876181
参考资料2:网站开发日记(14)-MYSQL子查询和嵌套查询优化
http://dodomail.iteye.com/blog/250199

根据网上这些资料的建议,改用join来试试。

修改前:select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');

修改后:select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';

mysql> select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';

67 rows in set (0.00 sec)

效果不错,查询所用时间几乎为0。看一下MySQL是怎么执行这个查询的

mysql>desc select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';
+—-+————-+——-+——+—————--+———--+———+—————--+——+————————--+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————--+———--+———+—————--+——+————————--+
| 1 | SIMPLE | b | ref | phone,number_id | phone | 66 | const | 6 | Using where; Using index |
| 1 | SIMPLE | a | ref | number_id | number_id | 4 | eap.b.number_id | 3 | |
+—-+————-+——-+——+—————--+———--+———+—————--+——+————————--+
2 rows in set (0.00 sec)

小结:当子查询速度慢时,可用JOIN来改写一下该查询来进行优化。

网上也有文章说,使用JOIN语句的查询不一定总比使用子查询的语句快。

参考资料3:改变了对Mysql子查询的看法
http://hi.baidu.com/yzx110/blog/item/e694f536f92075360b55a92b.html

 

 

mysql手册也提到过,具体的原文在mysql文档的这个章节:

I.3. Restrictions on Subqueries

13.2.8. Subquery Syntax

摘抄:

1)关于使用IN的子查询:

Subquery optimization for IN is not as effective as for the = operator or for IN(value_list) constructs.

A typical case for poor IN subquery performance is when the subquery returns a small number of rows but the outer query returns a large number of rows to be compared to the subquery result.

The problem is that, for a statement that uses an IN subquery, the optimizer rewrites it as a correlated subquery. Consider the following statement that uses an uncorrelated subquery:

The optimizer rewrites the statement to a correlated subquery:

If the inner and outer queries return M and N rows, respectively, the execution time becomes on the order of O(M×N), rather than O(M+N) as it would be for an uncorrelated subquery.

An implication is that an IN subquery can be much slower than a query written using an IN(value_list) construct that lists the same values that the subquery would return.

2)关于把子查询转换成join的:

The optimizer is more mature for joins than for subqueries, so in many cases a statement that uses a subquery can be executed more efficiently if you rewrite it as a join.

An exception occurs for the case where an IN subquery can be rewritten as a SELECT DISTINCT join. Example:

That statement can be rewritten as follows:

But in this case, the join requires an extra DISTINCT operation and is not more efficient than the subquery

from:http://www.cnblogs.com/xh831213/archive/2012/05/09/2491272.html

使用MySQL正则表达式

正则表达式作用是匹配方本,将一个模式(正则表达式)与一个文本串进行比较。 MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SELECT检索出的数据。 MySQL仅支持多数正则表达式实现的一个很小的子集。 ———————- 9.2.1  基本字符匹配 REGEXP后所跟的东西作为正则表达式处理。 SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name; ——返回—— +————————+ | prod_name | +————————+ | JetPack 1000 | +————————+     .  表示匹配任意一个字符。 SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name; ————返回———-- +————————-+ | prod_name | +————————-+ | JetPack 1000 | | JetPack 2000 | +————————-+   MySQL中的正则表达式匹配不区分大小写。 为区分大小写,可使用BINARY关键字。 如:WHERE prod_name REGEXP BINARY 'JetPack .000'   9.2.2  进行OR匹配 为搜索两个串之一(或者这个串,或者为另一个串),使用 | 。 | 作为OR操作符,表示匹配其中之一。可给出两个以上的OR条件。 SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000' ORDER BY […]

龙生   04 Jun 2015
View Details

解决:Entity Framework + MariaDb(MySql)中文乱码

今天写一MVC4+Entity Framework+Mysql的小例子时,发现中文写到数据库里是N个问号(乱码哦~); 于是跟了一下代码,发现页面提交过来的数据正常,这说明肯定是EF写到数据库时出了问题。 为了进一步验证,我用SQLServer2008试了一下,一切正常,那就在Mysql上找原因吧~ 但mysql库编码也是utf8,表也是utf8,这是什么原因呢? 百度了一把,看 了几篇文章也没能解决我的问题,无非都是要把网页、数据库、EF的编码改一致,我的本来都是一致的,难道是字段的编码?但字段的编码怎么改呢?也没找到方法,忽然看到字段的排序项是空的,会不会是它的原因呢?于是改成utf8——测试——一切正常~有图有真相:

龙生   14 May 2015
View Details

让Entity Framework支持MySql数据库

Entity Framework 4.0 也可以支持大名鼎鼎的MySql,这篇POST将向展示如何实现EF+MySql数据库的结构.首先,你必须下载 MySQL Connector/NET 6.3.5 ,也就是.net下连接MySql数据库的驱动程序. 还是像以往一样的,增加一个Entity data model: 将下面选择DataSource, 选择MySQL database 做为数据源. 接下来几步和以前一样,选择要Mapping的Tables: 好了,让我们来测试一下:

  可以工作.就是这么简单. 另一个消息是Entity Framework Code-First (CTP5 发布了). 如果您有兴趣可以看一下. from:http://www.cnblogs.com/wintersun/archive/2010/12/12/1903861.html

龙生   08 May 2015
View Details
1 28 29 30 44