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

Category Archives: Database

SQLite 数据类型

SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。 您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。 SQLite 存储类 每个存储在 SQLite 数据库中的值都具有以下存储类之一: 存储类 描述 NULL 值是一个 NULL 值。 INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 BLOB 值是一个 blob 数据,完全根据它的输入存储。 SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。 SQLite 亲和(Affinity)类型 SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型: 亲和类型 描述 TEXT 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。 NUMERIC 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。 INTEGER 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。 REAL 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。 NONE 不做任何的转换,直接以该数据所属的数据类型进行存储。 SQLite 亲和类型(Affinity)及类型名称 下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型: 数据类型 亲和类型 INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 INTEGER CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB TEXT […]

龙生   18 Jul 2017
View Details

SQLite可视化管理工具汇总

搜集了一些SQLite工具,在这里做个总结,有的工具用的多一些,有的只是简单试用,甚至未试用,所以有描述不当的还请回复指正,也欢迎补充完善! 2015-03-11 更新情况: SQLiteSpy最新版本1.9.8,重大改变,支持db拖拽 SQLiteStudio最新版本3.0.3,重大改变,打开数据量较大的数据库速度明显改善,还有count查询,堪比SQLiteExpert SQLiteExpert 最新版本3.5.76,相信也更好用了,尚未体验,SQLiteStudio已经很满足了,推荐! 【免费且保持更新】 1、SQLiteSpy  免费 单文件 http://www.yunqa.de/delphi/doku.php/products/sqlitespy/ 截至2012/9/14最新版本 SQLiteSpy 1.9.1 – 28 Jul 2011 单文件,界面设计紧凑,较稳定,功能较少,创建表与添加数据均需sql语句,快捷键教方便, 作为数据浏览和修改工具极佳,视图编码为utf-8,对gbk2312显示乱码。 能满足一般的应用,但没有导出数据表功能, 同时只能打开一个数据库文件 不支持二进制字段编辑 2、SQLiteStudio (推荐)开源 免费 单文件 http://sqlitestudio.one.pl/ 更新及时,功能完善的sqlite2和sqlite3工具,视图编码支持utf8。 支持导出数据格式:csv、html、plain、sql、xml, 可同时打开多个数据库文件 支持查看和编辑二进制字段 3、SQLiteExpert 个人免费 要安装 http://www.sqliteexpert.com/ 功能非常强大,如果上述两款不能满足,就试试这个吧 4、SQLite Manager(Firefox插件)免费,需要提前安装Firefox浏览器 https://addons.mozilla.org/zh-cn/firefox/addon/sqlite-manager/ 基本功能齐全,可以将数据表导出为sql数据格式。 【免费但可能已停止更新】 1、Sqlite3Explorer 免费 http://www.singular.gr/sqlite/ 两年未更新,截至2012/9/14最新版本 V3.04 04/12/2010 但xp下只是别gbk2312编码,界面紧凑,功能全面。 2、SQLite Database Browser 免费 http://sqlitebrowser.sourceforge.net/ 简单易用,具有基本数据库管理查询功能,并且能够导入和导出数据表,支持sql文件和csv两种方式。 似乎不再更新,截至2012/9/14最新版本: Version 2.0b1 released – Based on Qt4.6 – 12/09/2009 3、SQLiteAdmin 免费 http://sqliteadmin.orbmu2k.de/ 功能齐全,界面有多语言,带导出功能,很久未更新,只识别sqlite2,可用于sqlite2到sqlite3的转换, win xp下视图的编码为gbk2312,对utf-8显示乱码。 截至2012/9/14最新版本 [0.8.3.2]大概是2007年10月份   【收费版,通常功能丰富,更新及时】 1、Sqlite.Developer 收费 ¥79元 有中文版 http://www.sqlitedeveloper.com 2、SQLite Code Factory 收费 非商业单用户 $49 http://www.sqlmaestro.com […]

龙生   18 Jul 2017
View Details

C# SQLite 数据库操作学习

参考: SQLite 官网 SQL As Understood By SQLite System.Data.SQLite 菜鸟教程 SQL 教程 章节: 1、下载安装 2、数据类型 3、创建数据库 4、删除数据库 5、创建表 6、删除表 7、查询表结构 8、更改表名 9、增加列(字段) 10、读取创建表的 SQL 语句 11、更改列名 12、删除列 13、插入数据 14、替换数据 15、更新数据 16、删除数据 17、查询数据 18、获取查询数据的行数(多少条记录) 19、事务 Transaction 20、整理数据库 正文: 一、下载安装 这段时间在学习 C# 编程中,想写一个简单的进销存程序,就想到了用数据库,需要一个简单便携的桌面数据库,想自己写个,功力太浅,可以做为以后练手学习的项目。原来会用的 Foxpro 已经被微软不知丢在哪个旮旯了,在网上找了一下,发现只有 Access 和 Sqlite 可选,看了很多对比,决定还是学习使用 Sqlite。 在 System.Data.SQLite 官网的 download 中的 Setups for 64-bit Windows (.NET Framework 4.6) sqlite-netFx46-setup-x64-2015-1.0.104.0.exe (17.99 MiB) 下载然后运行安装。 更简单的做法是在 Visual Studio 2017 的 NuGet 中,输入:install-package system.data.sqlite.x64。 sqlite数据库的可视化工具中, SqliteExpert 不错,下载 SQLite Expert Personal 4.x 。 工具备齐了,由于知道上面这个System data Sqlite 是用 C# 封装好的,下来我们打开Visual Studio 2017,新开个工程,在菜单“项目”→“添加引用”→“浏览” […]

龙生   18 Jul 2017
View Details

C#操作SQLite数据库

SQLite介绍 SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。 SQLite数据库官方主页:http://www.sqlite.org/index.html C#操作SQLite Database C#下SQLite操作驱动dll下载:System.Data.SQLite C#使用SQLite步骤: (1)新建一个project (2)添加SQLite操作驱动dll引用 (3)使用API操作SQLite DataBase   using System; using System.Data.SQLite; namespace SQLiteSamples { class Program { //数据库连接 SQLiteConnection m_dbConnection; static void Main(string[] args) { Program p = new Program(); } public Program() { createNewDatabase(); connectToDatabase(); createTable(); fillTable(); printHighscores(); } //创建一个空的数据库 void createNewDatabase() { SQLiteConnection.CreateFile("MyDatabase.sqlite"); } //创建一个连接到指定数据库 void connectToDatabase() { m_dbConnection = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;"); m_dbConnection.Open(); } //在指定数据库中创建一个table void createTable() { string sql = "create table highscores (name varchar(20), score int)"; SQLiteCommand command […]

龙生   11 Jul 2017
View Details

SQLite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。 不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。 官网:https://www.sqlite.org/ .Net版本:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

龙生   08 Jul 2017
View Details

Mysql高并发优化

一、数据库结构的设计 1、数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。 2、能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。 3、对于不可变字符类型char和可变字符类型varchar 都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择VARCHAR。 4、字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。 二、查询的优化 保证在实现功能的基础上,尽量减少对数据库的访问次数(可以用缓存保存查询结果,减少查询次数);通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECTCOL1,COL2 FROM T1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。 在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。在数据量比较小的情况下,也许看不出明显的差别,但是当数据量大的情况下,这种情况就是极为糟糕的了。 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。 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.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select […]

龙生   07 Jul 2017
View Details

mysql高并发性能的关键要素

前言:最近一直在做项目的性能优化,经历了一个多星期的弯路,终于找到了一个突破点,经过和同事(非常感谢,稍后他会将过程写在他的博客,我会把连接地址跟贴到本博客)的努力,我们的期货交易平台性能在服务端已经得到很好的提升。 首先我们先看一下,我的电脑(i3-3220,4G内存,没有配置innodb_buffer_pool_size参数的情况下,抛开程序的性能,经过1个线程-8个线程的测试结果)环境下,大家可以看到如下的图,线程并发情况下,时间不断的攀升,这让人好苦恼,说好的高性能,高并发呢? 结果: 不过经过一个多星期的努力,不经意间,我在同事的电脑上发现,同样的代码测试后,时间和我的不是一个等量级的,要比我的电脑快很多,他的电脑(其他条件等同,CPU为i3-4150),8个商品8000挂单下能达到135ms,首先说明CPU的提升对程序处理来说是非常有效果的,但是依然在高并发的情况下,表现的很差劲。 时至今日,通过比对mysql的配置文件my.ini,不经意间,我们发现innodb_buffer_pool_size在8M和48M的配置下,性能简直就不在一个等级上,OK,那就继续调查吧,最终得出如下结论   ? 1 2 innodb_buffer_pool_size=2G innodb_buffer_pool_instances=1 详细的解释,可以看如下介绍 ? 1 2 3 4 5 6 7 8 # InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and # row data. The bigger you set this the less disk I/O is needed to # access data in tables. On a dedicated database server you may set this # parameter up to 80% of the machine physical memory size. Do not set it # too large, though, because competition of the physical memory […]

龙生   06 Jul 2017
View Details

Mysql做到高并发几点注意事项

1、拆分大的DELETE或INSERT语句   如果你需要在一个在线的网站上去执行一个大的DELETE或INSERT查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。 如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了。 所以,如果你有一个大的处理,你定你一定把其拆分,使用LIMIT条件是一个好的方法。下面是一个示例 2、垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。(以前,在银行做过项目,见过一张表有100多个字段,很恐怖) 示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段。那么,为什么不把他放到另外一张表中呢?这样会让你的表有更好的性能,大家想想是不是,大量的时候,我对于用户表来说,只有用户ID,用户名,口令,用户角色等会被经常使用。小一点的表总是会有好的性能。 示例二:你有一个叫“last_login”的字段,它会在每次用户登录时被更新。但是,每次更新时会导致该表的查询缓存被清空。所以,你可以把这个字段放到另一个表中,这样就不会影响你对用户ID,用户名,用户角色的不停地读取了,因为查询缓存会帮你增加很多性能。hp程序员之家 另外,你需要注意的是,这些被分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,这样的性能会比不分割时还要差,而且,会是极数级的下降   3、选择正确的存储引擎 在MySQL中有两个存储引擎MyISAM和InnoDB,每个引擎都有利有弊。酷壳以前文章《mysql: InnoDB 还是 MyISAM?》讨论和这个事情。hp程序员之家 MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM对于 SELECT COUNT(*) 这类的计算是超快无比的。 www~phperz~com InnoDB的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。   Myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的。 数据存储格式:Myisam的数据是顺序存储的,innodb数据存储方式是聚簇索引。 索引的指针:Myisam的索引btree上的节点是一个指向数据物理位置的指针,所以查找起来很快,innodb索引节点存的则是数据的主键,所以需要根据主键二次查找。 锁的策略:Myisam锁是表锁,只有读读之间是并发的,写写之间和读写之间(读和插入之间是可以并发的,去设置concurrent_insert参数,定期执行表优化操作,更新操作就没有办法了)是串行的,所以写起来慢,并且默认的写优先级比读优先级高,高到写操作来了后,可以马上插入到读操作前面去,如果批量写,会导致读请求饿死,所以要设置读写优先级或设置多少写操作后执行读操作的策略;Myisam不要使用查询时间太长的sql,如果策略使用不当,也会导致写饿死,所以尽量去拆分查询效率低的sql。 Innodb一般都是行锁,这个一般指的是sql用到索引的时候,行锁是加在索引上的,不是加在数据记录上的,如果sql没有用到索引,仍然会锁定表。mysql的读写之间是可以并发的,普通的select是不需要锁的,当查询的记录遇到锁时,用的是一致性的非锁定快照读,也就是根据数据库隔离级别策略,会去读被锁定行的快照,其它更新或加锁读语句用的是当前读,读取原始行;因为普通读与写不冲突,所以innodb不会出现读写饿死的情况,又因为在使用索引的时候用的是行锁,锁的粒度小,竞争相同锁的情况就少,就增加了并发处理,所以并发读写的效率还是很优秀的,问题在于索引查询后的根据主键的二次查找导致效率低; 注意: Innodb 聚集索引是按照主键(primarykey)进行聚集,被索引的列其实是主键列,如果没定义主键,Innodb会试着使用唯一非空索引Unique Index来代替。其他索引(普通索引)中不会保存行的物理位置,而是保存主键的值,所以通过"二级索引"进行查找是先找到主键,再找到行,要进行二次索引查找 组合索引和单列索引 组合索引在多列上创建,单列索引在一个列上创建。 查询使用索引的条件不同一般组合索引需要按照“最左前缀”来执行查询,并不是每个列都需要覆盖,只是从左边的列开始组合。 原因: 多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了。索引的最大好处就是:它必然是有序的。如果这个优点都不能利用,那索引也就没什么价值了。 例如有索引key(a,b,c) ³where a=xx and b=xx and c=xxx 此语句可以用到索引 ³where b=xx and a=xx and c=xxx 同上,顺序没有关系,同样能用到索引 ³where a=xx and b=xx 可以用到索引 ³where a=xx and c=xx 可以用到索引(这个以前一直理解错了) ³where b=xx and c=xx 用不到索引 ³where b=xx 用不到索引 ³where c=xx 用不到索引 from:http://blog.csdn.net/u011191420/article/details/53337802

龙生   06 Jul 2017
View Details

Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置

参考数据库链接串: <add key="data" value="server=192.168.1.123; Port=3306; uid=root; pwd=root;database=data;pooling=true;min pool size=5;max pool size=512;connect timeout = 20; "/>   查看应用程序池占用数量: select * from sysprocesses where dbid= db_id('数据库名')     Max Pool Size:如果未设置则默认为100,理论最大值为32767。最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。在等待队列中,默认等待与服务器的连接的时间为15秒。   中文错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 英文错误: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached. 问题描述:我们获取连接超过连接池最大值时产生如上异常。通常连接池最大值为100。当我们获取连接超过最大值时,ADO.NET等待连接池返回连接而超时,这样将抛出如上异常 解决办法:首先要做的是在我们使用连接后立即关闭连接。如果没有关闭连接那么连接将保存到连接池中知道GC来销毁。这种情况下你以为连接池没有到达最大值但实际上连接池已经到达了最大值 其次我们可以通过连接字符串中的Max Pool Size = N;来动态扩大连接池中的连接最大数量。 说明: 也就是在connectionString中如果未指定max pool size的值,则max pool size=100,当访问人员同时连接数据库的数量为101人时,则等待SqlConnection.ConnectionTimeout设置的时间(默认是15 秒)后,还是没有可用的Connection则会出现上面的错误。 当我们设置为: "Server=(local); Integrated Security=SSPI; Database=Northwind; Max Pool Size=512; Min Pool Size=5"  时。则访问人员同时连接数据库的数量为513时,则等待SqlConnection.ConnectionTimeout设置的时间(默认是15 秒)后,还是没有可用的Connection则 就会出现上面的错误。     –          Connection Pool 是什么呢 ? 每当程序需要读写数据库的时候。Connection.Open()会使用ConnectionString连接到数据库,数据库会为程序建立 一个连接,并且保持打开状态,此后程序就可以使用T-SQL语句来查询/更新数据库。当执行到Connection.Close()后,数据库就会关闭当 前的连接。很好,一切看上去都是如此有条不紊。 但是如果我的程序需要不定时的打开和关闭连接,(比如说 ASP.Net 或是 Web Service […]

龙生   06 Jul 2017
View Details
1 19 20 21 44