精华内容
下载资源
问答
  • I have changed the charset of the tables and of the column, i get the arabic text as ?... marks in MYSQL databasehere is the design of the tableCREATE DATABASE mydbDEFAULT CHARACTER SET utf8DEFAULT CO...

    I have changed the charset of the tables and of the column, i get the arabic text as ???? marks in MYSQL database

    here is the design of the table

    CREATE DATABASE mydb

    DEFAULT CHARACTER SET utf8

    DEFAULT COLLATE utf8_general_ci;

    CREATE TABLE `categories` (

    `category_id` tinyint(2) NOT NULL auto_increment,

    `category_name` varchar(50)character set utf8 NOT NULL ,

    PRIMARY KEY (`category_id`)

    insert into `mydb`.`categories`

    (`category_id`, `category_name`)

    values (1,'کتگوری');

    commit;

    When I again fire select query it shows ???? as text?

    Can anyone tell me where am i doing wrong?

    解决方案

    To insert Arabic Data manually into your Phpmyadmin.

    First you check either your database , table and column name is utf8 set or not.

    If these are not set to utf8 then first you set it then you may insert arabic data into you db table.

    YOU MAY CHECK EACH OF THESE BY LOOKING BELOW EXAMPLE.

    For Database:

    SELECT default_character_set_name FROM information_schema.SCHEMATA S

    WHERE schema_name = "schemaname";

    For Tables:

    SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,

    information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA

    WHERE CCSA.collation_name = T.table_collation

    AND T.table_schema = "schemaname"

    AND T.table_name = "tablename";

    For Columns:

    SELECT character_set_name FROM information_schema.`COLUMNS` C

    WHERE table_schema = "schemaname"

    AND table_name = "tablename"

    AND column_name = "columnname";

    You may easily set utf8 to your tables if you are using SQLYog.

    Just right click on db, table, column name and click on alter option and set to

    Database Chartset = utf8

    Database Collation = utf8_general_ci .

    Just Enjoy ....

    展开全文
  • Mysql支持很多种数据类型,选择正确的数据类型,对于获得高性能至关重要。...一般情况下,在确保没有低估需要储存的值的范围时,选择使用最小的数据类型储存数据。       原因 : 更...

    Mysql支持很多种数据类型,选择正确的数据类型,对于获得高性能至关重要。不管存储那种类型的数据,遵循以下几个简单的原则,有助于更好的选择。

    1. 更小的数据类型
            一般情况下,在确保没有低估需要储存的值的范围时,选择使用最小的数据类型储存数据。
            原因 : 更小的数据类型通常更快,因为它们占用更少的磁盘、内存、和CPU缓存,并且处理时需要的CPU周期更少。

    2. 简单就好(尽可能使用基础数据类型)
            简单的数据类型,操作通常需要更少的CPU周期。
      例:1、整型比字符操作代价更低。
             2、应该使用整型储存IP地址,而不是字符串。因为IP地址实际是32位无符号整数。(下面贴出转化函数)

    3. 尽量避免Null
             如果查询中包含可为Null列,对mysql来说更难优化,Null使得索引,索引统计,和值的比较都更复杂。当索引列有null值时,每个索引记录需要一个额外的字节去表示Null值。因而索引列,需要值比较的列,作为查询条件的列,尽量避免Null值,在百万级以上的数据量时,效果显而易见。

    4. 选择标识符(主键)
             一旦选择了一种类型,要确定在所有关联表中都使用同样的类型(关联字段),混用不同的数据类型可能会导致性能问题
             整数类型通常是标识列最好的选择,因为它们很快,并且可以是用AUTO_INCREMENT(自增Id)
             如果可以尽量避免选字符串类型作为标志列,因为字符串很消耗空间,并且比数字类型慢。
             尤其是在MyISAM(搜索引擎)表里使用字符串作为标志列时要特别小心,MyISAM默认对字符串使用压缩索引,这会导致查询慢的多。

    • IP地址存储
             INET_ATON()将IP地址转为32位无符号整数
             INET_NTOA()将32位无符号整数转为IP地址
    SELECT INET_ATON('127.0.0.1');
    
    SELECT INET_NTOA(2130706433);
    
    • 总结(高性能Mysql Schema与数据类型优化截图)
      在这里插入图片描述
    展开全文
  • 优秀的设计和逻辑是高性能的基本保障,我们来看下关于mysql使用schema数据类型优化的一些建议和原则。 1.选择优化的数据类型的常用规则 更小的通常更好 一般选择更小的数据类型能满足业务场景的需求,小的数据...

    前言:

    优秀的设计和逻辑是高性能的基本保障,我们来看下关于mysql使用schema和数据类型优化的一些建议和原则。

    1.选择优化的数据类型的常用规则

    • 更小的通常更好
      一般选择更小的数据类型能满足业务场景的需求,小的数据类型意味着更小的cpu开销,更小的内存,储存空间的使用,可以提高效率。
    • 简单的数据类型
      整型的数据类型比字符型,浮点型数据要来的简单,处理起来也更方便。
    • 尽量避免使用NULL
      如果不是必须要储存NULL值的话,一般情况下都要指定列为NOT NULL。可以为NULL的列会使用更多的空间,使用的时候也需要消耗额外的资源。
      而且当列时NULL的时候,建立索引也需要额外的开销,并且上面的唯一索引不会将NULL算为唯一的,多条NULL的数据都可以保存成功,会对数据的唯一性也造成干扰。

    2. 选择数据类型的优化

    2.1 整数类型 :

    1.mysql的证书类型:TINYINT(8),SMALLINT(16),MEDIUMINT(24),INT(32),BIGINT(64)后面小括号中的数字是占用的存储空间。
    2.unsigned不会影响mysql的储存空间,有符号的INTYINT储存范围是-128~127,无符号的TINY能储存0~255。总共包含的数值尺寸(总共256个数字),
    但是数据的范围是有变化的。可以根据具体的场景来设置最合适的范围。
    3.对于整数类型而言int(1)和int(20)没有区别,计算和储存都不会有影响,只是可能会影响一些mysql的客户端工具显示字符的个数。
    注:这里稍微扯一点题外话,TINYINT设置为1和大于1的数字,会影响mybatis generator逆向生成java bean和xml的时候的数据格式。
    TINYINT(1)会对应Boolean类型,TINYINT(n) n>1的话显示的是Byte类型。
    

    2.2 实数类型

    1.mysql内部使用DOUBLE作为浮点型运算的类型,DECIMAL只是一种储存格式,在计算的时候也会转换为DOUBLE。DOUBLE和DECIMAL,mysql5.0之后对DECIMAL进行了优化,可以支持高精度的计算,但是会比较消耗性能,DOUBLE计算更快但是可能会丢失经度。
    2.因为DECIMAL使用了更多的空间和计算的消耗,所以只在对小数进行精确计算的时候才使用DECIMAL,正常储存浮点数不用计算的话,DOUBLE就够了。
    3.还有一种方式就是使用整型来储存浮点数,将要储存的浮点数乘以小数的位数变成整型在储存起来。这样可以避免浮点储存计算不精确和DECIMAL计算消耗大的问题。
    

    2.3 字符串类型

    1.varchar可能是我们用的最多的类型了,它是可变长度的,varchar(1000)如果只用到了10个字节,实际上储存空间上就用了11个字节,一个字节用来记录字符串的长度,当字符串超过255个字节的时候会使用两个字节。另一个char是不可变的字符串,
    如果是char(10),实际上使用了11个字节,1个用来记录字符串的长度。
    2.不过因为varchar是可变长的,如果字段更新操作时变长了,会需要额外的开销,所以varchar最合适的场景是字符串最大长度比平均长度大很多,而且更新不频繁。
    3.char在储存字符串的时候,会把末尾的空格给去掉,如果是'abc  ',实际使用和储存时都是'abc'。
    4.如果设置了ROW_FORMAT=FIXED,即使是varchar也是会使用定长字节来储存的
    5.之前从来没有用过mysql的枚举类型数据,看了书才知道还有枚举类型,平时基本上都是用的java建的枚举类使用比较方便。mysql的枚举类底层储存的也是整数,估计是做了
    hash的操作给映射成整数了,不过如果mysql的枚举要联表查询的话性能消耗比较高,可能这也是不太常用的原因之一吧。
    

    2.4 日期类型 官方文档链接

    1.datetime格式范围大概是从1001年-9999年(如果超过了9999年会怎么样呢?会报错的),timestamp这个是从1970年1月1日开始的,而且范围贼小到2038-01-19 03:14:07,
    因为我们是东八区所以可以在加八个小时。  
    所以最好不要用时间戳,这还有18年可能你写的程序就会因为时间格式超过了范围而报错。
    2.timestamp在插入时没有值会默认写入一个当前时间戳的值,切不能为null。
    3.mysql数据库支持的时间粒度是秒,如果要储存更小粒度的时间,可以使用mysql的分支MariaDB,或者使用BIGINT,DOUBLE处理后来储存时间戳。
    

    2.5 位数据类型

    1.set和bit都可以用来存储true/false的值,不是很常用。例如保存某个数据的状态可以用bit,不过一般用tinyint会更常见一些。
    

    2.6 选择标识符

    1.为标识列选择合适的数据类型很重要。整数型 > 字符串 > set/enum
    

    2.7 特殊类型数据

    1.这里谈到一个例子IPV4,人们经常用VARCHAR(15)来储存,实际上去除掉符号点,是一个无符号的整数。用整数来储存更加合适,
    mysql提供了INET_ATON()和INET_NOTA()来转换。
    

    3.schema设计的陷阱

    3.1 太多的列

    mysql储存引擎和服务层之前拷贝数据的时候,会将缓存的内容解码为各个对应的列。但是
    一张表如果列宽很长,几千个列这样,实际使用的时候有时候只用到了小部分数据,这样解码效率就很低,查询也会变得很慢。
    

    3.2 太多的关联

    mysql限制了每个关联最多61张表(当然我觉得是够用了,要是一个关联能关联61张表,那就设计上很有问题了)。经验法则,一个查询要想又快又能保持并发性良好,关联最好不超过12张表。
    

    3.3 全能的枚举

    一个枚举如果包含了太多的数据,当成了字典来使用的话,当要进行修改的使用因为是阻塞操作,会导致使用这个枚举的业务都停下来。
    

    3.4 变相的枚举

    当使用set来代替enum来使用的时候,比如记录是true/false,如果有很多个这样的值,用set来储存容易导致混乱,最好用enum。
    

    3.5 NULL的替代方案

    前面说了尽量不使用NULL,我们可以使用-1,0,空字符串来代替。但是不要每个地方都这样用,有时候使用替代方案可能会导致编写代码和业务场景变得更加复杂,比如其他部门都用NULL,我们使用-1,这样很多调用部分都得做出相应的修改。
    在具体的场景可以具体分析,并不是说NULL就不能用了。
    
    展开全文
  • 高性能MysqlSchema数据类型优化选择优化的数据类型MySQL schema设计中的陷阱 选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获取高性能至关重要,不管存储那种类型的数据,有几个原则...

    选择优化的数据类型

    MySQL支持的数据类型非常多,选择正确的数据类型对于获取高性能至关重要,不管存储那种类型的数据,有几个原则都有助于我们做出更好的选择

    • 更小的通常更好
      一般的情况下应该尽量使用最小的数据类型,因为他们更快,占用的磁盘、内存和CPU缓存更少,而且在处理他们的时候需要的CPU周期也更少。但是要确保没有低估所需存储的值的范围,如果无法确定那个数据类型是最好的,就选择你不会超过范围的最小类型。
    • 简单就好
      简单数据的操作通常需要更少的CPU周期。例如,整形比字符型操作代价更低,因为字符集和排序规则使字符类型比整形要复杂。
    • 尽量避免null
      可为null的列使得索引、索引统计和值比较都更复杂。可为null的列会使用更多的存储空间,在Mysql里也需要特殊处理,当可为null的列被索引时每个索引记录需要一个额外的字节,在MyISAM里甚至可能导致固定大小的索引变成可变大小的索引。通常把可为null的列改为not null带来的性能提升比较小,所以调优时没有必要首先在现有表中查找并修改掉这类问题,除非确定这会导致问题,但是如果计划在列上建立索引,就应该避免设计成为可为null的列。

    MySQL schema设计中的陷阱

    下面是一些设计MySQL的schema的问题,这也许会帮助我们避免这些错误,并且可以找到一些更好的替代方案。

    • 太多的列
      MySQL的存储引擎API工作时需要在服务器层和存储引擎层之间通过缓冲格式进行拷贝数据,然后在服务器将缓冲内容解码成各个列,这个代价是非常高的,而且转换的代价依赖于列的数量。如果计划使用数千个字段,必须意识到服务器的性能运行特征会有一些不同。

    • 太多的关联
      所谓的”实体-属性-值“(EAV)设计模式是一个糟糕的设计模式,尤其是在MySQL下不能靠谱的工作。MySQL限制了每个关联操作最多只能有61张表,但是在EAV数据库需要许多自关联,事实上许多关联少于61张表的情况下,解析和优化查询也会成为MySQL的问题。如果希望查询执行的快速而且并发性好,单个查询最好能在12个表以内做关联。

    • 全能的枚举
      注意防止过度使用枚举。例子:
      CREATE TABLE ...( country enum('','1','2',...'31'))
      这种模式的表设计非常凌乱,这么使用枚举是一个有问题的设计方案,应该使用整数作为外键关联到字典表或者查找表来查找具体的值。在MySQL中,当需要在枚举列表中增加一国家就要做一次ALTER TABLE,在之前的版本这个操作是一个阻塞操作(5.1之后的版本,如果是在末尾添加值是不需要ALTER TABLE的)

    • 变相的枚举
      枚举列允许在列中存储一组定义值中的单个值,集合(SET)列则允许在列中存储一组定义值中的一个或多个值。这时候容易导致混乱,例子:
      CREATE TABLE ...( is_default set ('Y','N') not null default('N'))
      如果这里真和假两种情况不会同时存在,那么应该用枚举代理集合列。

    • 非此发明的NULL
      我们之前讨论了避免使用NULL的好处,并且尽量可能的考虑代替方案。即使需要存储一个事实的空值到表中,我们可以用0、某个特殊字符或者空字符串代替。 。
      但是遵循这个原则也不要走极端。当确实需要表示未知值也不要害怕使用NULL。在某些场景下使用NULL可能会比某个神奇的神奇常数要好。从特定的类型的值域选择一个不可能的值。例如-1代表一个未知的整数,可能会使代码变复杂,或者引入bug。处理NULL确实不容易,但有时候使用NULL会比替代它的方案更好。下面举个例子:
      CREATE TABLE ...( dt DATETIME not null default '0000-00-00 00:00:00')
      这样可能会导致很多问题(MySQL会在索引中存储NULL,而Oracle不会)

    范式和反范式

    在范式化的数据库中,每个数据会出现并且只出现一次,而在反范式化的数据库中,信息是冗余的,可能存在多个地方。(如果不熟悉范式,可以先去了解一下)

    • 范式的优点和缺点
      优点
      1、范式化的更新操作通常比反范式更快
      2、当数据较好的范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据
      3、范式化的表通常很小,可以更好地放在内存里,所以执行操作会更快
      4、很少有冗余的数据意味着检索列表数据时更少需要DISTINCT或者GROUP BY语句

      缺点
      1、范式化的表设计通常需要关联,稍微复杂一点的查询语句在符合范式的表上都可能需要一次关联,也许更多。这不但价格昂贵,也可能使一些索引策略无效。
    • 反范式的优点和缺点
      优点
      1、反范式化的表因为所有数据都在一张表中,可以很好的避免关联
      2、如果不需要关联表,则对大部分查询最差的情况-即使没有使用索引-是全表扫描,当数据比内存大时这样可能会比关联快得多,因为这样避免了随机I/O。
      3、可以更有效的使用索引策略。

      缺点
      可以参考范式的优点
    #没有使用反范式
    SELECT message_text,user_name from message INNER JOIN 
    user ON message,user_id=user.id WHERE user.account_type='premiumv'
    ORDER BY message.published DESC LIMIT 10;
    #使用反范式
    SELECT message_test,user_name FROM message
    WHERE account_type='premiumv' 
    ORDER BY message.published DESC LIMIT 10;
    
    • 混用范式化和反范式化
      通常我们的数据库设计在,没有绝对的范式化和反范式化。在实际应用中经常需要混合使用。
      最常见的反范式化数据的方法时复制和缓存,在不同的表中存储相同的特定列。在MySQL5.0和更新版本中,可以使用触发器更新缓存值,这使得这个方案变得简单。
      在上面的例子中我们在user表和message中都存储account_type字段,而不用完全的反范式化。这避免了完全反范式化的插入和删除问题,因为即使没有消息的同时也绝对不会丢失用户的信息,这样也不会把message表搞得太大,有利于高效地获取数据,但是有个问题,这样的话用户的账户类型更新的代价就变高了,因为需要操作两张表。这时候我们就需要考虑更新的频率以及更新的时长,并和执行查询的频率进行比较。

    缓存表和汇总表

    有时候提升性能最好的办法是在同一张表中保存衍生的冗余数据,然而,有时候也需要创建一张完全独立汇总表或者缓存表,如果能容许少量的脏数据,这是非常好的办法,但是有时确实没有选择的余地(例如:需要避免复杂、昂贵的实时更新操作)
    仍然以网站为例,加入需要计算之前24小时内发送的小数,在一个很繁忙的网站不可能维护一个实时精确的计数器。作为替代方案,可以每小时生成一张汇总表。这样也许不是一条简单的查询就可以做到,并且比实时维护计数器要高效得多。缺点是计数器并不是100%准确。

    加快ALTER TABLE操作的速度

    这一块没怎么用过,就先放一个链接吧,有需要可以看看加快ALTER TABLE 操作速度

    展开全文
  • 抽空整理了一下MySQL中的Schema数据类型优化相关的知识点,有点零碎。MySQL数据类型相对来说比Oracle的数据类型要多,所以,MySQL使用起来也会相对更加灵活一些。在数据存储管理方面,MySQL的使用者可以根据自己...
  • 本章覆盖了MySQL特有的schema设计方面的主题 1.选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。 ...
  • Schema数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计SCHEMA,这往往需要权衡各种因素。如:反范式设计可以加快某些类型的查询,但同时可能会使另一些查询变慢和...
  • 简单数据类型需要更少的CPU周期,整型比字符串操作代价更低,比如应该用整型存储ip地址,使用mysql内建的date,time,datetime而不是字符串储存时间 尽量避免null 通常情况下最好制定列为not nul
  • 高性能Mysql——Schema数据类型优化

    千次阅读 2015-05-11 22:10:06
    一、选择优化的数据类型 更小的通常更好 占用更小的磁盘、内存、CPU缓存和处理时需要的CPU周期 简单就好 操作需要更少的CPU周期,例如:整型比字符型操作代价更低,以为字符集和校对规则使字符比整型更复杂。...
  • Schema数据类型优化 ... ——《高性能MySQL》选择优化的数据类型选择优化数据类型概述对于MySQL来说他是支持很多数据类型的,那么对于MySQL来说选择合适的数据类型对高性能是有很大的帮助的;通常
  • 高性能MySql阅读笔记第四章--Schema数据类型优化阅读笔记 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素。 本章主要为接下来的索引优化与查询...
  • Schema是什么鬼 schema就是数据库对象的集合,这个集合包含了各种对象如:表、视图、存储过程、索引等。为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的schema名等于...
  • 文章目录Schema数据类型优化一、选择优化的数据类型更小的通常更好简单就好尽量避免NULL二、数值类型字符串枚举日期和时间类型三、 MySQL schema设计中的陷阱四、范式和反范式1.范式的优点:五、缓存表和汇总表六、...
  • MySQL官方文档指出,从概念上讲,schema是一组相互关联的数据库对象,如表,表列,列的数据类型,索引,外键等等。但是从物理层面上来说,模式与数据库是同义的。你可以在MySQL的SQL语法中用关键字SCHEMA替代...
  • schema优化就是指逻辑设计 选择合适的数据类型: 1. 更小的通常更好 2. 简单就好 3. 尽量避免NULL(null字段将会多占用1个字节来存储是否为null) 基本数据类型 整数类型: TINYINT、SMALLINT、MEDIUMINT、INT、...
  • Schema数据类型优化——MySQL schema设计中的陷阱
  • mysql schema设计方法

    千次阅读 2017-07-31 11:46:28
    使用简单类型:简单数据类型的操作通常需要更少的CPU周期,例如,整型比字符操作代价更低。 更小的类型:一般情况下,尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为更小的类型占用更少的...
  • Schema数据类型优化
  • 高性能MySQL学习笔记——第四章Schema数据类型优化4.1选择优化的数据类型整数类型实数类型字符串类型BLOB和TEXT类型日期和时间类型:DATETIME :TIMESTAMP:4.2 MySQL schema设计中的陷阱范式与反范式如何插入一段...
  • 高性能MySQL(三):Schema数据类型优化

    千次阅读 多人点赞 2021-02-22 22:00:52
    MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。 下面几个简单的原则有助于做出更好的选择: 更小的通常更好 简单就好 避免NULL 本篇默认存储引擎是InnoDB 整数类型 有两种类型的数字:...
  • 但要确保没有低估需要存储的值的范围,因为在schema中的多个地方增加数据类型的范围是一个非常耗时和痛苦的操作。简单简单数据类型的操作通常需要更少的CPU周期。避免NULL很多表都包含可为null的列,即使应用程序不...
  • MYSQL performance schema详解MYSQL performance schema详解0、performance_schema的介绍1、performance schema入门2、performance_schema表的分类3、performance_schema的简单配置与使用4、常用配置项的参数说明5、...
  • MySQL数据类型和Schema优化MySQL合适的数据类型Schema设计Schema设计坏味道范式与反范式缓存表和汇总表 MySQL 良好的逻辑设计与物理设计是高性能的基石,应该根据具体业务需求的查询语句来设计schema,这往往需要...
  • infromation_schema库中的表,保存的是Mysql的元数据,是一个虚拟数据库,物理上并不存在相关的目录和文件。该库中包含的元数据表如下。 ​ CHARACTER_SETS:保存所有Mysql可用的字符集。相当于命令SHOW CHARACTER...
  • select * from information_schema.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='asset_lender_loan_dtl' and REFERENCED_COLUMN_NAME='id'information_schema数据库是MySQL自带的,它提供了访问数据库元数据的...
  • information_schemamysql数据库的一个系统数据库,它提供了数据库元数据的访问方式,保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。 数据表ta...
  • 高性能MySQL —— 3、服务器性能剖析 和 Schema数据类型优化1. 服务器性能剖析2. Schema数据类型优化2.1 选择优化的数据类型2.1.1 整数类型2.1.2 实数类型2.1.3 字符串类型2.1.4 日期和时间类型2.1.5 位数据类型...
  • 很多MySQL数据类型可以存储相同类型的数据,只是存储的长度和范围不一样、允许的精度不同,或者需要的物理空间(磁盘和内存空间)不同。 别名 MYSQL为了兼容性支持很多别名,例如integer、bool、numeric,他们都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,735
精华内容 24,294
关键字:

mysqlschema保存数据

mysql 订阅