미국 오라클은 오픈 소스로 개발된 데이터베이스 "MySQL"의 최신 버전인 "MySQL 5.7"의 정식 공개를 발표했다(2015. 10. 19).

 

MySQL 5.7의 주요 특징은 다음과 같다.

 

실행 속도 향상

SysBench SysBench Read-only Point-Selects의 결과 1024 연결에서 MySQL 5.7 MySQL 5.6 3배가 되는 160만 쿼리/(QPS)의 값을 나타냈다.

 

InnoDB의 새로운 기능 등

성능 향상이나 병렬도 향상과 온라인 상태에서의 조작 향상, Spatial Index, 네이티브 파티셔닝 등의 새로운 기능이 추가.

 

리플리케이션 강화

멀티 소스 리플리케, 글로벌 트랜잭션 아이덴티화이어(GTIDs) 확장, 멀티 쓰레드화 된 종속에 의한 확장성과 가용성 향상 등.

 

새로운 네이티브 JSON 데이터형과 JSON Function

스키마레스 데이터를 효과적이고 유연하게 보존, 검색, 조작이 가능하고 새로운 내부 바이너리 포맷으로 SQL과의 통합이 쉽다.

 

 

이런 새 기능과 함께 MySQL 5.7에서는 약 1년마다 패스워드를 변경하는 것이 기본 설정된다.

 



출처: http://www.publickey1.jp/blog/15/mysql_573.html

 


저작자 표시
신고
by 흥배 2015.10.28 08:00

MySQL 5.7에서 기하연산(GIS)을 위해 Boost 라이브러리의 Geometry를 사용.


5.6에서는 자체 구현을 했지만 간혹 발생하는 이상한 케이스에 대해서 하나씩 수정할지 기존 알고리즘을 선택할지 고민하다가 Boost의 Geometry를 사용하는 것을 선택.


MySQL 커뮤니티는 단순하게 Boost.Geometry를 소비하는 것만이 아닌 앞으로 공헌해 나갈 것을 알림.

Boost.Geometry를 더 좋게 만들기 위해서 MySQL 개발자 2명이 풀 타임으로 활동.

저작자 표시
신고
by 흥배 2014.05.13 08:00

오라클 사가 9.21~23에 주최한 이벤트에서 발표된 자료

 

 

Facebook은 기본적으로 그래프이다.

그래프에는 Vertices과 Edge가 있다.

빅데이터라고 부르는 분야에서 나온 Hadoop나 데이터웨어하우스의 대부분은 배치 처리로 데이터가 분석된다.

그러나 Facebook의 MySQL 데이터는 리얼타임으로 접근하고 있다. Facebook 페이지 상에서 친구 리스트를 참조하는 것은 MySQL에서 나온 것일 수 있다.

 

피크 시의 최대 처리 속도. 대부분이 사진이나 댓글 이라는 유저에 의해 생성된 데이터이며, 이것들이 MySQL에서 처리된다. 이 처리에는 추가, 업데이트, 삭제도 있다.

 

유저들의 요청 양

 

캐시 후의 데이터 읽기만으로 이 정도의 수가 유저에게 전달 된다.

 

 

마스터와 슬레이브로 크게 2개로 나누어지며, 이 2개는 지리적으로 떨어져 있다.

각각의 리젼에는 복수의 Front End Cluster와 Back End Cluster가 있다.

Front End Cluster에는 웹서버가 있고, HPHP가 동작하고 있다. 클라스터마다 캐시도 준비 되어 있다.

Back End Cluster에는 MySQL 데이터 베이스가 있고 캐시도 있다. 마스터 리젼과 슬레이브 리젼 사이에는 MySQL 레플리케이션이 돌아가고 있다.

 

 

Facebook 독자적인 PHP

HPHP는 Facebook이 만든 것으로 성능 향상을 위해서이다. HPHP에는 2개의 버전이 있으며 하나는 컴파일 버전으로 PHP를 C++로 변환하여 그것을 바이너리로 컴파일 하여 실행 시 처리가 가볍게 된다.

또 하나는 JavaVM과 같은 PHP를 바이트 코드로 변환하여 VM 상에서 실행하는 것. 이것도 CPU 처리 부하를 가볍게 해준다.

 

 

캐시에는 Memcache를 사용

Front End Cluster에는 Cluster Cache가 있으며 여기에는 아주 뜨거운 최신 데이터가 들어가 있다. 예를 들면 (미국 아이돌)져스틴 비버가 사진을 투고하면 아주 많은 주목을 받을 것을 알고 있으므로 이 데이터는 각각의 클래스터의 Cluster Cache에 들어가고 각각의 클래스터는 여기에 접근한다.

Cluster Cache는 부하를 분산하는 것이 역할이기 때문에 Web 서버에 가까이 있는 것이 중요하다.

Region Cache는 데이터 베이스로의 접근을 회피하여 고속화 하기 위한 캐시이다.

TAO는 우리들이 개발한 것으로 기본적으로는 Memcache를 베이스로 한 자작 그래프 서버이다. Facebook의 그래프 모델을 이해하고 있다.

Wormhole에는 Pub/Sub 시스템으로 MySQL이 로그를 여기에 쓰면 이 내용을 다른 디스트리뷰로 간다.

 

 

MySQL 운용 자동화 툴을 이용

수천 수만대의 MySQL을 관리하고 있기 때문에 툴인 MySQL Pool Scanner를 만들었다.

이것은 자동화 시스템으로 새 서버가 배치되면 OS 등 이미지를 넣어서 MySQL을 설치하고, 필요한 데이터를 서버에 복사해서 실전에 투입한다. 실전 가동 중에는 모니터링을 하고, 부서지면 수리하여 다시 이미지를 넣어서 고친다.

 

 

스토리지 활용을 위한 압축이 중요

Flash/Flachcache 2 종류의 스토리지를 사용하고 있다.

Facebook에서는 고속 스토리지로 100% SSD를 사용한 시스템을 채용하고 있다.

그러나 비용이 비싸기 때문에 SSD와 거대 용량의 HDD를 합쳐서 대용량이며 SSD로 고속 접근을 실현한다.

 

압축은 아주 중요. 왜냐하면 많은 플래시 스토리지를 사용하고 있으며 여기에는 용량적인 제약이 있기 때문이다.

이 제약을 뛰어 넘기 위해 압축은 아주 중요하다. 지금까지 실 데이터는 대부분 압축을 하고 있다.

뛰어난 압축을 위해서 리소스를 투입하고 있으며 현재 아주 잘 동작하고 있다.

 

 

 

출처: http://www.publickey1.jp/blog/13/facebookmysqlmysql_connect_2013.html

 

 

신고
by 흥배 2013.12.30 08:00

MySQL 라이브러리 설치

NuGet으로 설치한다.

 

Dapper.NET 설치

  • ADO.NET 라이브러리만으로 DB 프로그래밍 하기에는 번잡한 것이 많다. 그렇다고 ORM 사용하기에는 성능 문제와 너무 오버스럽다.
  • Micro-ORM 라이브러리인 Dapper.NET 사용하면 아주 간단하게 DB 프로그래밍을 있다.
  • 그냥 ADO.NET 사용했을 때와 비교해도 성능 차이는 거의 없다. 성능 하락은 없으면서 안전한고 생상성이 있다
  • 역시 NuGet으로 설치한다

 

Dapper.NET 기본 사용 방법

  • MS SQL Server 계열과 postgres 계열은 Dapper 확장으로 지원하므로 Dapper 의식하지 않고 사용해도 괜찮다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

public static SqlConnection GetOpenConnection()

{

   var connection = new SqlConnection(connectionString);

   connection.Open();

   return connection;

}

   

public void TableName()

{

   using (var connection = GetOpenConnection())

   {

      // tests against "Automobiles" table (Table attribute)

      connection.Insert(new Car {Name = "Volvo"});

      connection.Get<Car>(1).Name.IsEqualTo("Volvo");

      connection.Update(new Car() {Id = 1, Name = "Saab"}).IsEqualTo(true);

      connection.Get<Car>(1).Name.IsEqualTo("Saab");

      connection.Delete(new Car() {Id = 1}).IsEqualTo(true);

      connection.Get<Car>(1).IsNull();

   }

}

   

public class Car

{

   public int Id { get; set; }

   public string Name { get; set; }

}

  • 그러나 MySQL 같은 것들은 Dapper SqlMapper 클래스를 사용해야 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IDbConnection connectionFactory()

{

   string ConnString = "Server=172.20.60.221;Database=test;Uid=root;Pwd=패스워드";

   

   IDbConnection db = new MySql.Data.MySqlClient.MySqlConnection(ConnString);

   return db;

}

   

private void button1_Click(object sender, EventArgs e)

{

   var db = connectionFactory();

   db.Open();

   

   var member = Dapper.SqlMapper.Query<USER>(db, "select ID, PW from Account where ID = 'M1_1'");

}

   

public class USER

{

   public string ID { get; set; }

   public string PW { get; set; }

}

  • 만약 매핑 클래스의 이름과 테이블의 필드 이름(정확하게는 sql 문에서 지정한 이름. 보통은 필드 이름으로) 서로 다르면 쿼리 결과에서 셋팅을 못한다.

  • 문자 비교를 /소문자 비교는 하지 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

struct Point

{

   public int X { get; set; }

   public int Y { get; set; }

   public int Z { get; set; }

}

   

using(var connection = Connect())

{

   // strongly typed objects

   var result1 = connection

            .Query<Point>("select @x as X, @y as Y, @z as Z", new { x = 1, y = 2, z = 3 })

        .First();

   Console.WriteLine("X:{0} Y:{1} Z:{2}", result1.X, result1.Y, result1.Z); // X:1 Y:2 Z:3

    

   // dynamic objects

   var result2 = connection

        .Query("select @x as X, @y as Y, @z as Z", new { x = 1, y = 2, z = 3 })

        .First();

   Console.WriteLine("X:{0} Y:{1} Z:{2}", result2.X, result2.Y, result2.Z); // X:1 Y:2 Z:3

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

class QueryResult

{

   public DayOfWeek DayOfWeek { get; set; } // .NET의 프로퍼티

}

   

using(var connection = Connect())

{

   // int를 DayOfWeek 프로퍼티에 맵핑한다.

   var result1 = connection

        .Query<QueryResult>("select 1 as DayOfWeek;")

        .First();

   Console.WriteLine(result1.DayOfWeek);    // Monday

    

   // 문자열을 DayOfWeek 프로퍼티에 맵핑한다.

   var result2 = connection

        .Query<QueryResult>("select 'Monday' as DayOfWeek;")

        .First();

   Console.WriteLine(result2.DayOfWeek);    // Monday

    

   // int를 DayOfWeek로 얻는다.

   var result3 = connection

        .Query<DayOfWeek>("select 1;")

        .First();

   Console.WriteLine(result3);  // Monday

    

}

 

 

Dapper.NET 사용 - 쿼리 갯수 얻기

 

 

 

 

 

 

 

 

 

 

 

 

public class Product

{

  public int ProductId { get; set; }

  public string Name { get; set; }

  public string ProductNumber { get; set; }

}

   

using (var connection = connectionFactory())

{

  var result = connection.Query<int>("select count(*) from Product").Single();

  Console.WriteLine(result + " products.");

}

 

 

Dapper.NET 사용 - 쿼리 인자 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

using (var connection = connectionFactory())

{

  var result =

      connection.Query<Product>(

          "select * from Product where ListPrice between @low and @high",

          new { low = 10.0, high = 100.0 });

     

  Console.WriteLine("-- simple mapping:" + result.Count());

     

  foreach (var p in result)

  {

      Console.WriteLine(string.Format("ID:{0},Name:{1}", p.ProductId, p.Name));

  }

}

 

 

Dapper.NET 사용 - 매핑에 다이나믹 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

using (var connection = connectionFactory())

{

  var result =

      connection.Query(

          "select * from Product where ListPrice between @low and @high",

          new { low = 10.0, high = 100.0 });

     

  Console.WriteLine("-- dynamic mapping:" + result.Count());

     

  foreach (var p in result)

  {

      Console.WriteLine(string.Format("ID:{0},Name:{1},Price:{2}", p.ProductID, p.Name, p.ListPrice));

  }

}

 

 

Dapper.NET 사용 - 하나의 쿼리에 개의 객체를 맵핑할

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

class Book {

    public string Isbn { get; set; }

    public string Title { get; set; }

}

   

class Order {

    public int Id { get; set; }

    public DateTime Date { get; set; }

    public Book Book { get; set; }

}

   

var orders = connection.Query<Order, Book, Order>(@"

select

  1 as Id,

  '2013/02/16' as Date,

  '0001234567890' as Isbn,

  '굉장한 책' as Title;",

    (order, book) => {

        order.Book = book;

        return order;

    },

    // "Isbn" 부터 Book에 맵핑한다

 splitOn: "Isbn");

   

foreach(var order in orders)

{

    Console.WriteLine("{0} {1:d} {2} {3}", order.Id, order.Date, order.Book.Isbn, order.Book.Title);

}

결과

1 2013/02/16 0001234567890 굉장한

 

 

Dapper.NET 사용 - insert

 

 

var affected_rows = connection.Execute(

    @"insert MyTable(colA, colB) values (@a, @b)",

    new[] { // 파라메터를 배열로 하면 복수 행을 insert 할 수 있다.

        new { a=1, b=1 },

        new { a=2, b=2 },

        new { a=3, b=3 }

    }

);

 

 

Dapper.NET 사용 - Execute a Command that returns no results

 

connection.Execute(@"

  set nocount on

  create table #t(i int)

  set nocount off

  insert #t

  select @a a union all select @b

  set nocount on

  drop table #t", new {a=1, b=2 })

   .IsEqualTo(2);

 

 

Dapper.NET

사용 - Multiple Results
 

var sql =

@"

select * from Customers where CustomerId = @id

select * from Orders where CustomerId = @id

select * from Returns where CustomerId = @id";

    

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))

{

   var customer = multi.Read<Customer>().Single();

   var orders = multi.Read<Order>().ToList();

   var returns = multi.Read<Return>().ToList();

   ...

}

 

 

Dapper.NET

사용 - Execute
 

public class Category

{

    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime ModifiedOn { get; set; }

}

   

public class SubCategory : Category

{

    public int CategoryId { get; set; }

}

   

public int InsertSubCategory(SubCategory subCategory)

{

    using (IDbConnection connection = OpenConnection())

    {

        const string query =

          "INSERT INTO Production.ProductSubcategory(ProductCategoryID, [Name]) " +

          "VALUES (@CategoryId, @Name)";

        int rowsAffectd = connection.Execute(query, subCategory);

        SetIdentity<int>(connection, id => subCategory.Id = id);

        return rowsAffectd;

    }

}

 

 

Dapper.NET

사용 - Update
 

public int UpdateSubCategory(SubCategory subCategory)

{

    using (IDbConnection connection = OpenConnection())

    {

        const string query = "UPDATE Production.ProductSubcategory " +

                             "SET ProductCategoryID = @CategoryId, " +

                             "[Name] = @Name, " +

                             "ModifiedDate = @ModifiedOn " +

                             "WHERE ProductSubcategoryID = @Id";

        return connection.Execute(query, subCategory);

    }

}

 

 

Dapper.NET

사용 - Delete

 

 

public int DeleteSubCategory(SubCategory subCategory)

{

    using (IDbConnection connection = OpenConnection())

    {

        const string query = "DELETE FROM Production.ProductSubcategory " +

                             "WHERE ProductSubcategoryID = @Id";

        return connection.Execute(query, subCategory);

    }

}

 

 

Dapper.NET 사용 - Stored Procedures

 

var user = cnn.Query<User>("spGetUser", new {Id = 1}, commandType: CommandType.StoredProcedure).First();}}}

 

 

 

var p = new DynamicParameters();

p.Add("@a", 11);

p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);

p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

   

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure);

   

int b = p.Get<int>("@b");

int c = p.Get<int>("@c");

 

Dapper.NET

사용 - Stored Procedures 인자에 객체 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

public void TestProcWithOutAndReturnParameter()

{

   connection.Execute(

        @"CREATE PROCEDURE #TestProcWithOutAndReturnParameter

        @ID int output,

        @Foo varchar(100),

        @Bar int

        AS

        SET @ID = @Bar + LEN(@Foo)

        RETURN 42");

            var obj = new

            {

                ID = 0,

                Foo = "abc",

                Bar = 4

            };

          

   var args = new DynamicParameters(obj);

   args.Add("ID", 0, direction: ParameterDirection.Output);

   args.Add("result", 0, direction: ParameterDirection.ReturnValue);

   connection.Execute("#TestProcWithOutAndReturnParameter", args, commandType: CommandType.StoredProcedure);

   args.Get<int>("ID").IsEqualTo(7);

   args.Get<int>("result").IsEqualTo(42);

}

 

 

 

Dapper.NET 사용 - Transaction

 

 

public int DeleteProduct(Product product)

{

    using (IDbConnection connection = OpenConnection())

    {               

        const string deleteImageQuery = "DELETE FROM Production.ProductProductPhoto " +

                                        "WHERE ProductID = @ProductID";

        const string deleteProductQuery = "DELETE FROM Production.Product " +

                                          "WHERE ProductID = @ProductID";

        IDbTransaction transaction = connection.BeginTransaction();

        int rowsAffected = connection.Execute(deleteImageQuery,

            new { ProductID = product.ProductID }, transaction);

        rowsAffected += connection.Execute(deleteProductQuery,

            new { ProductID = product.ProductID }, transaction);

        transaction.Commit();

        return rowsAffected;

    }

}

 

 

Dapper.NET 사용 - Ansi Strings and varchar

 

Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

신고
by 흥배 2013.10.07 08:00

Ubuntu에 설치 및 실행

sudo apt-get install mysql-server

설치 중 root(MySQL의)의 암호를 입력(잘 기억해야 한다)

설치 확인 sudo netstat -tap | grep mysql

재 시작하기 sudo /etc/init.d/mysql restart

종료 mysql stop

시작 mysql -u root -p



외부에서 접속하기

mysql은 기본 설치한 상태에서는 외부에서 접속할 수 없다.!!!

방법 http://valley.egloos.com/viewer/?url=http://devxpert.egloos.com/1017656 참고 했음

권한 설정

prompt> mysql -u root -p

prompt> use mysql;

prompt> GRANT ALL PRIVILEGES ON *.* to 'root'@'%' IDENTIFIED BY 'password';

prompt> flush privileges;

*.* =>데이터베이스명.테이블명

root => 계정명

password => 계정의 패스워드

flush privileges; => 서버에 권한이 변경되었음을 알리고 즉시 반영되도록


mysql 재시작

sudo /etc/init.d/mysql restart



mysql GUI Tool

오라클에서 제공하는 Workbench 라는 괜춘한 툴이 있다.

리눅스, Mac OS, Windows를 지원한다(아마 자바 설치가 필요할 듯).

다운로드 http://dev.mysql.com/downloads/mirror.php?id=412167

사용 방법 http://blog.naver.com/doblhead/80191288595

저작자 표시
신고
by 흥배 2013.10.03 08:00

웹서핑하다가 알게된 것을 공유합니다. 다음 버전의 MySQL이 상당히 기대됩니다.



MySQL Conference & Expro 2011의 기조 강연에서 차기 버전인 MySQL 5.6 MySQL Cluster 7.2은 지금 보다 한 단계 더 높은 강력한 성능향상과 신 기능이 들어갈 예정이라고 밝혔다.

 

이번 주에 MySQL 5.6의 최신 디벨로퍼 마일스톤을 릴리즈 했다. 디벨로퍼 마일스톤은 아직 QA가 남아 있지만 기능적으로는 안정된 버전이다.

성능향상, 확장성, 모니터링, 옵티마이즈 베이스의 성능 향상등을 실현하였고. 쿼리로 명시적으로 버전 선택이랑 파티션 테이블의 import, export등을 갖추고 있다.

InnoDB의 개선도 있어서 더욱 성능 향상이 있었다.

여기에다 MySQL 5.6에서 실현하려고 하는 것은 현재까지 연구실에서 개발 중이지만 SQL이 아닌 방법으로 InnoDB 스토레이징에 접근하는 방법을 제공하는 것이다. Memcached 프로토콜로 NoSQL로 접근 할 수 있게 된다. flexibility만이 아닌 더욱 고성능, 고 확장성도 실현 할 수 있다. Memcached 플러그인으로 제공한다.

 

SQL NoSQL의 인터페이스는 병렬로 제공 하기 때문에 언제라도 어느쪽이라도 접근 할 수 있다. 또한 연구에서는 패럴레이션을 사용하는 멀티스레드 Slave, 성능에 관한 다양한 정보를 저장하는 Performance_schema의 강화도 하고 있다.

 

 

MySQL 7.2에서는 조인이 고속으로

MySQL Cluster 7.2도 디벨로퍼 마일스톤으로 릴리즈 했다. 쿼리 조인 성능이 약 20배 정도 빨라졌다. 또 스키마의 유연성을 늘렸고, 512 컬럼까지 지원한다. Data Consolidation, 저장 프로시저랑 Grant 등의 설정을 중안 관리할 수도 있다.

Memcached API를 지원하여 캐쉬를 통일적으로 관리할 수 있다.

오라클은  Oracle VM MySQL을 집어 넣어서 바로 이용할 수 있는 Oracle VM Template for MySQL도 릴리즈 할 예정이다.

 

 

Windows판의 우선도를 높이다.

지금까지 MySQL Windows의 우선도는 높지 않았다. 그러나 이제부터는 우선도를 올려간다. 성능이랑 확장성뿐만이 아닌 인스톨러를 개선하고, Visual Studio랑 프레임워크등의 에코 시스템과의 연계도 강화해 간다.

 



더 자세한 내용은 유튜브에 공개된 세션 영상을 보세요

http://www.youtube.com/watch?v=L1V5T5rknq0

 

저작자 표시
신고
by 흥배 2011.04.19 09:00
| 1 |

티스토리 툴바